首页 >web前端 >js教程 >jQuery嵌套元素的mouseover和mouseout事件详解

jQuery嵌套元素的mouseover和mouseout事件详解

黄舟
黄舟原创
2017-06-28 13:56:581482浏览

今天在帮别人解决一个关于mouseover和mouseout问题的时候发现了一个原来没想到的问题,斗胆share下,高手莫喷。。 

问题:有嵌套的三层div。div111最外层,div222中间层,div333最内层。 
效果:当鼠标位于div的上方时,相应层的mouseover触发,当属性从div的上方离开时,相应层的mouseout触发。(比如:当鼠标从div111移动到子元素div222,div333时,不会触发div111的mouseleave事件,反过来当从子元素div222,div333到div111时,不会触发div111的mouseenter事件, 

此段代码同时也解决了mouseover和mouseout由于子元素的冒泡而产生的一些问题。不知道有没更好的方案? 

<!DOCTYPE html>        
<html>        
    <head>        
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />        
        <title>test</title>        
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>        
        <style>        
            #div111{        
                width:200px; height :200px ; background :red; margin :100px auto auto 100px; border: 2px solid white;   
            }        
            #div222{        
                width:100px; height :100px; background :yellow; border: 2px solid white; 
            }        
            #div333{        
                width:50px; height :50px; background :blue; border: 2px solid white; 
            }
        </style>        
    </head>        
    <body>        
        <div id="div111">         
            <div id="div222">         
                <div id="div333"></div>         
            </div>         
        </div>    
        <div id="log"></div>         
        <script type ="text/javascript" >         
            function mouse_over(event){    
                var elem = $(event.currentTarget),  
                    fromElem = $(event.relatedTarget);  
                if(elem.has(fromElem).length === 0 || !fromElem.is(elem)){
                	elem.css(&#39;border-color&#39;, &#39;green&#39;);
                    log(elem.attr(&#39;id&#39;), event.type);
                }  
            };      
            function mouse_out(event){    
                var elem = $(event.currentTarget),  
                    toElem = $(event.relatedTarget);
                if(elem.has(toElem).length === 0 || !toElem.is(elem)){
                	elem.css(&#39;border-color&#39;, &#39;white&#39;);
                    log(elem.attr(&#39;id&#39;), event.type);
                }  
            };
            function log(id, type){
            	$("#log").append("<div><span>" + id + "触发了<strong><font color=&#39;red&#39;>" + type + "</font></strong>事件</span></div>");  
            }
            $(&#39;#div111&#39;).mouseover(mouse_over);      
            $(&#39;#div222&#39;).mouseover(mouse_over);      
            $(&#39;#div333&#39;).mouseover(mouse_over);      
            $(&#39;#div111&#39;).mouseout(mouse_out);      
            $(&#39;#div222&#39;).mouseout(mouse_out);      
            $(&#39;#div333&#39;).mouseout(mouse_out);  
        </script>         
    </body>        
</html>

jquery里面还有两个神奇的事件 

一个叫做mouseenter 

一个叫做mouseleave 

mouseenter和mouseleave这两东西完全做不到这种效果好吧。。对于嵌套的,他们就是废柴

切,我还以为是什么大问题,直接绑定一次事件就可以,使用e.target就可以进行判断具体发生在哪个元素上,根据元素来处理更节省资源。

   mouseover/out是冒泡的,所以自然会引起这问题
IE下用mouseenter/leave
其他浏览器下用addEventListener注册的时候第3个参数传true就行

IE的mouseenter/leave,当鼠标从div111移动到div222的时候,会触发div111的mouseleave和div222的mouseenter,反过来当从div222到div111的时候,会触发div222的mouseleave和div111的mouseenter,完全就不符合要求,他们只适合没有嵌套的应用。 
其他浏览器的捕获模式,实现这种效果不会比冒泡模式简单,而且还不兼容IE。。

但是mouseenter和mouseleave就是为解决这个问题才产生的。YUI中也有,可以处理嵌套的冒泡。 
jquery的不好用?!

好不好用看场合,个人认为 

$().mouseenter(function(){  
    //do something  
});

$().mouseover(function(event){  
    if(!$(this).data(&#39;mouseover&#39;).mouseover){  
        $(this).data(&#39;mouseover&#39;, {mouseover: true});  
        //do something  
    }  
    event.stopPropagation();  
});

没区别

以上是jQuery嵌套元素的mouseover和mouseout事件详解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn