非IE浏览器实现onmouseenter

每次遇到onmouseover事件的处理就头疼。比如父标签A里面嵌套了两个子标签,分别为标签A1和A2。假设你在父标签A上绑定了mouseover事件,理想的状态应该是:当鼠标从A标签外移到A标签上,事件触发。

但实际情况是,在以下几种情况下,mouseover事件都会被触发,下图为mouseover事件触发示意图(mouseout事件类似)。

  1. 当鼠标从A标签外移到A标签上。
  2. 当鼠标从父标签A移入子标签B(或C)。
  3. 当鼠标从子标签B移入子标签C(假设间距足够小的话)。

之前一直是通过在事件处理函数里面判断触发当前时间的targe是否指定节点来解决上面问题,问题是,当标签嵌套层次比较多的时候,这个判断过程就变得很麻烦,还会让处理函数里面多处一堆跟逻辑不相关的代码。

请教了某同事,IE浏览器支持mouseenter事件,可以轻松搞定以上问题,刚好现在手头做的东西也是只需要支持IE浏览器(\
(^o^)/)。然后就想了,如果突然需求变更说要支持其他非IE浏览器了,那不就惨了(这也是很有可能发生的),像firefox、chrome都是不
支持mouseenter的。那就只能自己试着去模拟下了:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>在非IE浏览器里模拟mouseenter、mouseleave事件</title>
<style>
.outer{width:400px;height:300px;background:#ccc;}
.inner{float:left;width:150px;height:150px;margin:20px;background:#000;}
</style>
</head>
<body> 

<div id="outer" class="outer">

    <div id="innerA" class="inner"></div>
    <div id="innerB" class="inner"></div>
</div>
<div id="output"></div>
</div>
</body>

<script>
var EventUtil = {
    //事件绑定
    addEvent:function(element,type,handler){

        if(element.attachEvent){    //为IE浏览器

            element.attachEvent("on"+type,handler);

        }else if(element.addEventListener){    //firefox、chrome等浏览器

            if(type=="mouseenter" || type=="mouseleave"){    //对“mouseenter”、“mouseleave”事件做单独绑定处理

                //利用“mouseover”、“mouseout”来模拟“mouseenter”、“mouseenter”
                var eType = (type=="mouseenter")?"mouseover":"mouseout";
                element.addEventListener(eType,EventUtil.wrapHandler(handler),false);
            }else{

                element.addEventListener(type,handler,false);
            }

        }else{    //其他浏览器

            element["on"+type] = handler;
        }
    },
    //对事件处理函数进行包装
    //如果触发事件的元素跟绑定事件的元素相同,则调用处理函数
    wrapHandler:function(handler){

        var func = function(event){

            var target = event.target;
            var parent = event.relatedTarget;

            while(parent && parent!=this){    //

                try{parent = parent.parentNode;}
                catch(e){break;}
            }
            //parent不等于this,说明触发事件的正是绑定事件的element本身
            (parent!=this)    && (handler.call(target,event));
        };

        return func;
    },
    //事件移除,省略
    removeEvent:function(element,handler){

        //这里没有任何东西
    }
};
function $(id){return document.getElementById(id);}

EventUtil.addEvent($("outer"),"mouseenter",handler);
EventUtil.addEvent($("outer"),"mouseleave",handler);

//
function handler(e){

    var event = null,target = null;
    if(window.event){
        event = window.event;
        target = e.srcElement;
    }else{
        event = e;
        target = e.target;
    }
    $("output").innerHTML += event.type+":"+target.id+"<br/>";
}
</script>

在firefox和IE 8里简单测试了下,顺利运行,搞定!

以上只是简单地在非IE浏览器里模拟了mouseenter和mouseleave事件,只是实验下,代码写的有点挫各种见谅,主要的是实现的原理。

文章参考了另一篇博文:http://kb.cnblogs.com/a/1627921/,写得不错,就是不知道为什么下面的“运行代码”一直没反应。

时间: 2024-11-04 23:29:01

非IE浏览器实现onmouseenter的相关文章

ajax如何处理火狐浏览器或其它非ie浏览器的兼容性

如果选择的浏览器不是 Internet Explorer,或者为非 Microsoft 浏览器编写代码,就需要使用不同的代码.事实上就是 清单 1 所示的一行简单代码: var xmlHttp = new XMLHttpRequest object;. 这行简单得多的代码在 Mozilla.Firefox.Safari.Opera 以及基本上所有以任何形式或方式支持 Ajax 的非 Microsoft 浏览器中,创建了XMLHttpRequest对象. 结合起来 关键是要支持所有浏览器.谁愿意编

XHTML:非IE浏览器里对style.height赋值无效的问题

xhtml|浏览器|问题 今天我在做多页面MDI脚本控件(MzMultiPage),在IE等浏览器里都已经测试通过没有任何问题,但是在Mozilla.Firefox.Netscape里测试时问题就来了,我的多页面是在页面里用到了 iframe,这些 iframe 初始的 style.height 都是0,而在加载页面之后,iframe 就会自适应被加载的页面高度,我是通过 iframe.style.height=300 这样撑起 iframe 的高度,这样处理在IE系列浏览器里没有任何问题,但在

IE 和非IE浏览器的条件注释

浏览器|条件 (X)HTML 下面一段代码是测试在微软的IE浏览器下的条件注释语句的效果 <!--[if IE]><h1>您正在使用IE浏览器</h1><![endif]--><!--[if IE 5]><h1>版本 5</h1><![endif]--><!--[if IE 5.0]><h1>版本 5.0</h1><![endif]--><!--[if IE

初学者的忧伤-我想在非ie浏览器的页面中执行一个js,然后打开一个指定的ie页面

问题描述 我想在非ie浏览器的页面中执行一个js,然后打开一个指定的ie页面 ActiveX只有在ie中才能运行,我现在想在谷歌或者火狐浏览器网页中自动打开一个ie浏览器的指定页面,请问直接用js可以实现吗? 解决方案 [原创]在winform程序中实现在IE浏览器中打开一个新的页面,全屏化并屏蔽IE窗口的工具栏和地址栏 解决方案二: 没有这种办法.页面在哪个浏览器打开就会在哪个浏览器呈现,页面不属于任何一个浏览器专有.你要想支持activeX,就只能在IE浏览器中打开.

html-如何在非ie浏览器使用js打开文件,并获取文件内容

问题描述 如何在非ie浏览器使用js打开文件,并获取文件内容 如何在非ie浏览器使用js打开文件,并获取文件内容? html中是一个input 解决方案 用ajax的方式 <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <script type="text/javascript" src=

求资源 求分享-自定义弹出确定取消框,方便程度最好和confirm一样。主要是在非ie浏览器上兼容

问题描述 自定义弹出确定取消框,方便程度最好和confirm一样.主要是在非ie浏览器上兼容 自定义弹出确定取消框,方便程度最好和confirm一样.主要是在非ie浏览器上兼容.求源码.用js或者css实现都可以. 解决方案 artDialog,注意这个和confirm不一样,不能挂起后续代码的执行,后续的代码依据点击是否来执行的话要放回调里面 解决方案二: sweetalert UI很漂亮 我自己的所有项目都用的这个

静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。_图象特效

请新建文件TestImage.html 注意:静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器.欢迎与邀月交流,net技术与软件架构内容如下,(可自行修改): 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmln

怎么在非IE浏览器实现这个功能?想在客户端获取证书内的信息,用于与服务器进行数据交互。

问题描述 怎么在非IE浏览器实现这个功能?想在客户端获取证书内的信息,用于与服务器进行数据交互. 怎么在非IE浏览器实现这个功能?想在客户端获取证书内的信息,用于与服务器进行数据交互.想利用JAVASCRIPT之类的代码,实现这个证书弹窗.有点类似于IE的ACTIVEXOBJECT.

js xmlHttp对象IE浏览器和非IE浏览器创建方法

js xmlhttp对象ie浏览器和非ie浏览器创建方法 例子:创建一个xmlhttp对象,并向服务器请求一个xml文档,返回文档后显示.下面分别就ie和非ie进行实例讲解 1) ie浏览器使用activexobject方式创建xmlhttp对象: var xmlhttpreq = new activexobject("msxml2.xmlhttp.3.0"); xmlhttpreq.open("get", "http://localhost/test.x