javascript中mouseover和mouseout事件详解
(2012-12-03 17:16:23)
标签:
mouseoutmouseovermousrenterjavascript鼠标事件 |
分类: css/js/html5 |
我翻阅了百度最新开源的JS库tangram,看了里面的处理,发现它貌似是单独处理了非IE浏览器下的事件,使用一个叫“baidu.event._eventFilter._crossElementBoundary(listener, e)”的方法修正mouseover和mouseout,然后封装了个mouseEnter和mouseLeave事件。
baidu.event._eventFilter._crossElementBoundary = function(listener, e){
var related = e.relatedTarget,
current = e.currentTarget;
if(typeof related == 'undefined'){
return listener.call(current, e);
}
if(
related === false ||
// 如果current和related都是body,contains函数会返回false
current == related ||
// Firefox有时会把XUL元素作为relatedTarget
// 这些元素不能访问parentNode属性
// thanks jquery & mootools
related.prefix == 'xul' ||
//如果current包含related,说明没有经过current的边界
baidu.dom.contains(current, related)//注:baidu.dom.contains是个定义的检测节点是否包含的函数,下面我会讲到
){
return ;
}
//调用执行
return listener.call(current, e);
};
而jQuery则不是这么做的,它是直接对IE和其它所有浏览器下的mouseover和mouseout事件进行了修正。参考jQuery,我得到了我目前所有的代码。
function contains(p,c){
return p.contains ?
p != c && p.contains(c) :
!!(p.compareDocumentPosition(c) & 16);
}
function fixedMouse(e,target){
var related,
type=e.type.toLowerCase();//这里获取事件名字
if(type=='mouseover'){
related=e.relatedTarget||e.fromElement
}else if(type='mouseout'){
related=e.relatedTarget||e.toElement
}else return true;
return related && related.prefix!='xul' && !contains(target,related) && related!==target;
}
//addListener为封装的事件绑定函数
addListener(target,'mouseover',function(e){
e=e||window.event;
if(fixedMouse(e, target)){
//do something
}
},false);
”

加载中…