`

onMouseOut() 经过子元素也触发的问题( FireFox)

阅读更多

请看http://xuganggogo.iteye.com/admin/blogs/538476,有更简单解决方案。

 

 

在FireFox下,处理onMouseOut() 经过子元素也触发的问题与IE下大不相同,而且步骤比较多。

 

1,首先FF不支持,event.toElement 和 event.formElement , 但是我们可以自己让FF支持,如下

 

//创建兼容 IE/FireFox 的 event 及 event 的 srcElement、fromElement、toElement 属性----start
function  FixPrototypeForGecko()  {  
  HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);  
  window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);  
  Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);  
  Event.prototype.__defineGetter__("fromElement",  element_prototype_get_fromElement);  
  Event.prototype.__defineGetter__("toElement", element_prototype_get_toElement);
}  
function  element_prototype_get_runtimeStyle() { return  this.style; }  
function  window_prototype_get_event() { return  SearchEvent(); }  
function  event_prototype_get_srcElement() { return  this.target; }  
function element_prototype_get_fromElement() {  
  var node;  
  if(this.type == "mouseover") node = this.relatedTarget;  
  else if (this.type == "mouseout") node = this.target;  
  if(!node) return;  
  while (node.nodeType != 1) 
	  node = node.parentNode;  
  return node;  
}
function  element_prototype_get_toElement() {  
	var node;  
	if(this.type == "mouseout")  node = this.relatedTarget;  
	else if (this.type == "mouseover") node = this.target;  
	if(!node) return;  
	while (node.nodeType != 1)  
	 node = node.parentNode;  
	return node;  
}
function  SearchEvent() {  
  if(document.all) return  window.event;  
  func = SearchEvent.caller;  
  while(func!=null){  
	  var  arg0=func.arguments[0];  
	  if(arg0 instanceof Event) {  
		  return  arg0;  
	  }  
	 func=func.caller;  
  }  
  return   null;  
}

 

 

2,FF不支持contains方法,但是有compareDocumentPosition方法。

function mouseoutIM( evt ){
var res= evt.compareDocumentPosition(event.toElement) ;
    if( ! ( res == 20 || res == 0) ){ 
        alert('ok');   
    }
}
}

 

 

3,compareDocumentPosition()方法说明

NodeA.compareDocumentPosition(NodeB)

    这个方法是 DOM Level 3 specification 的一部分,允许你确定 2 个 DOM Node 之间的相互位置。这个方法比 .contains() 强大。这个方法的一个可能应用是排序 DOM Node 成一个详细精确的顺序。

    使用这个方法你可以确定关于一个元素位置的一连串的信息。所有的这些信息将返回一个比特码(Bit,比特,亦称二进制位)。

    对于那些,人们知之甚少。比特码是将多重数据存储为一个简单的数字(译者注:0 或 1)。你最终打开 / 关闭个别数目(译者注:打开/关闭对应 0 /1),将给你一个最终的结果。

    这里是从 NodeA.compareDocumentPosition(NodeB) 返回的结果,包含你可以得到的信息。

 

 

 Bits          Number        Meaning
000000         0              元素一致
000001         1              节点在不同的文档(或者一个在文档之外)
000010         2              节点 B 在节点 A 之前
000100         4              节点 A 在节点 B 之前
001000         8              节点 B 包含节点 A
010000         16             节点 A 包含节点 B
100000         32             浏览器的私有使用

    现在,这意味着一个可能的结果类似于:

 

 

 <div id="a">
 <div id="b"></div>
</div>
<script>
 alert( document.getElementById("a").compareDocumentPosition(document.getElementById("b")) == 20);
</script>

    一旦一个节点 A 包含另一个节点 B,包含 B(+16) 且在 B 之前(+4),则最后的结果是数字 20 。如果你查看比特发生的变化,将增加你的理解。

000100 (4) + 010000 (16) = 010100 (20)

    这个,毫无疑问,有助于理解单个最混乱的 DOM API 方法。当然,他的价值当之无愧的。

 

分享到:
评论

相关推荐

    js下关于onmouseout、事件冒泡的问题经验小结

    问题是这样的:一个div元素要触发onmouseout事件,同时这个div内部还有子元素,于是当鼠标移动到该div的子元素上时,onmouseout事件也被触发了。在要做浮动层效果的时候会经常遇到这个问题。 解决方法一: 使用...

    js 阻止子元素响应父元素的onmouseout事件具体实现

    本文为大家介绍下js阻止子元素响应父元素的onmouseout事件,具体实现如下,感兴趣的朋友可以参考下

    javascript中onmouse事件在div中失效问题的解决方法

    这是由于javascript自身的冒泡特性导致的(即在子元素上触发了事件,并冒泡到了父元素-堆栈后进先出算法)。今天在网上搜了一下,找了以下的解决办法(兼容IE和Firefox)。 在IE下解决问题很简单,用onMouseEnter、...

    兼容ie和firefox的鼠标经过(onmouseover和onmouseout)实现--简短版

    兼容ie和firefox的鼠标经过(onmouseover和onmouseout)实现--简短版

    兼容ie和firefox的鼠标经过(onmouseover和onmouseout)实现–简短版

    前段时间一直找这个的简短实现 网上也有很多方法 昨天发现了这种方法 感觉是用代码最少的 呵呵 ie下支持css的js ff等支持:hover 就这样了 觉得好的就顶起来 无标题文档 #b_g_date tr{ event:[removed]...

    onmouseover和onmouseout的一些问题思考

    但随之烦恼也就来了:onmouseover并不会只在移进时才触发,onmouseout也不会只在移出时才触发!鼠标在DIV里面移动时也会可能触发onmouseover或onmouseout。 在上图中,对于’A’来说:当鼠标进入’A'(路径’1′)时...

    javascript onmouseout 解决办法

    onmouseout 发现它的触发太敏感,当经过层内文字链时,即触发onmousetout事件,功能不能正常显示,经过一番搜索,整理出来,供大家参考。 1、 代码如下: [removed] function test(obj, e) { if (e.currentTarget) { ...

    js下关于onmouseout、事件冒泡的问题经验小结.docx

    js下关于onmouseout、事件冒泡的问题经验小结.docx

    onmouseover事件和onmouseout事件全面理解

    这两天接触了onmouseover事件和onmouseout事件,一直以为它们只是简单的分别实现鼠标指针移动到元素上时触发事件和在鼠标指针移出指定的对象时触发事件,但是突然发现这些只是对它们简单的描述,下面让我们一起看看...

    javascript onmouseout 解决办法.docx

    javascript onmouseout 解决办法.docx

    浏览器事件大全.txt

    onmouseout IE4、N3 当鼠标离开某对象范围时触发此事件 onkeypress IE4、N4 当键盘上的某个键被按下并且释放时触发此事件. onkeydown IE4、N4 当键盘上某个按键被按下时触发此事件 onkeyup IE4、N4 当键盘上某个...

    用户行为检测与禁止(HTML和JS)

    onmouseout 鼠标从某个对象上移走时触发 oncontextmenu 用户右键时触发 复制粘贴行为检测 函数 条件 oncopy 用户复制时触发 oncut 用户剪切时触发 onpaste 用户粘贴时触发 对用户行为的检测有...

    编译的 HTML 帮助文件 (.chm) DHTML手册

    onmouseout 当用户将鼠标指针移出对象边界时触发。 onmouseover 当用户将鼠标指针移动到对象内时触发。 onmouseup 当用户在鼠标位于对象之上时释放鼠标按钮时触发。 onmousewheel 当鼠标滚轮按钮旋转时触发。 ...

    Html事件列表

    onMouseOut HTML: 当鼠标离开某对象范围时触发的事件 onKeyPress HTML: 当键盘上的某个键被按下并且释放时触发的事件.[注意:页面内必须有被聚焦的对象] onKeyDown HTML: 当键盘上某个按键被按下时触发的事件[注意:...

    js事件总结

    onMouseOut IE4|N3|O3 当鼠标离开某对象范围时触发的事件 onKeyPress IE4|N4|O 当键盘上的某个键被按下并且释放时触发的事件.[注意:页面内必须有被聚焦的对象] onKeyDown IE4|N4|O 当键盘上某个按键被按下时触发的...

    onmouse事件总结

    onMouseOut IE4|N3|O3 当鼠标离开某对象范围时触发的事件 onKeyPress IE4|N4|O 当键盘上的某个键被按下并且释放时触发的事件.[注意:页面内必须有被聚焦的对象] onKeyDown IE4|N4|O 当键盘上某个按键被按下时触发的...

Global site tag (gtag.js) - Google Analytics