• 为非IE浏览器添加mouseenter,mouseleave事件


    先了解几个事件对象属性

    target: 指事件源对象,点击嵌套元素最里层的某元素,该元素就是target。IE6/7/8对应的是srcElement。
    currentTarget: 指添加事件handler的元素本身,如el.addEventListener中el就是currentTarget。IE6/7/8没有对应属性,可在handler内使用this来替代如evt.currentTarget = this。
    relativeTarget: 指事件相关的元素,一般用在mouseover,mouseout事件中。IE6/7/8中对应的是fromElement,toElement。

    mouseentermouseleave IE9中仍然支持,mouseenter与mouseover区别在于:在元素内部移动时mouseenter不会触发。如下

    <!DOCTYPE HTML>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>mouseerter与mouseover区别(IE下测试)</title>
    </head>
    <body>	
    <div id="result" style="position:absolute;right:100px;top:5px;250px;height:400px;border:2px solid gray;overflow:auto;">	
    </div>
    <h3>1,鼠标在div[id=parent1]内部移动时会触发mouseover事件</h3>
    <div id="parent1" style="400px;border:1px solid gray;padding:5px;">
    	<div id="child11" style="100px;height:100px;background:gold;float:left;">Child11</div>
    	<div id="child12" style="100px;height:100px;background:gold;float:right;">Child12</div>
    	<div style="clear:both;"></div>
    </div>
    <br/>
    <h3>2,鼠标在div[id=parent2]内部移动时不会触发mouseenter事件</h3>
    <div id="parent2" style="400px;border:1px solid gray;padding:5px;">
    	<div id="child21" style="100px;height:100px;background:gold;float:left;">Child21</div>
    	<div id="child22" style="100px;height:100px;background:gold;float:right;">Child22</div>
    	<div style="clear:both;"></div>
    </div>
    
    <script type="text/javascript">
    	function on(el,type,fn){
    		el.addEventListener ? el.addEventListener(type, fn, false) : el.attachEvent('on' + type, fn);
    	}
    	function $(id){
    		return document.getElementById(id);
    	}
    	var p1 = $('parent1'),
    		p2 = $('parent2');
    	function fn(e){
    		var d = document.createElement('div');
    		d.innerHTML = e.type;
    		$('result').appendChild(d);
    	}
    	on(p1,'mouseover',fn);
    	on(p2,'mouseenter',fn);
    </script>
    <body>
    </html>
    

      

      

    了解了这三个属性的意义后,实现起来就很简单

    E = function(){
       function elContains(a, b){
    		try{
    			return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(b) & 16);
    		}catch(e){}
    		
       }
    	function addEvt(el, type, fn){
    		function fun(e){
    			var a = e.currentTarget, b = e.relatedTarget;
    			if(!elContains(a, b) && a!=b){
    				fn.call(e.currentTarget,e);
    			}	
    		}	
    		if(el.addEventListener){
    			if(type=='mouseenter'){					
    				el.addEventListener('mouseover', fun, false);					
    			}else if(type=='mouseleave'){
    				el.addEventListener('mouseout', fun, false);
    			}else{
    				el.addEventListener(type, fn, false);
    			}
    		}else{
    			el.attachEvent('on' + type, fn);
    		}
    	}	
    	return {addEvt:addEvt};
    }();
    

      

    相关:

    Greg Reimer 的博文 Goodbye mouseover, hello mouseenter

  • 相关阅读:
    JSON和Object数组在js中的转换
    Raphael绘制箭头arrow
    Web后台框架开发
    数据库开发
    docker
    git
    linux
    正则表达式工具
    python模拟ls命令
    python3基础
  • 原文地址:https://www.cnblogs.com/snandy/p/1997414.html
Copyright © 2020-2023  润新知