Jquery mouseover多次触发问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jquery mouseover多次触发问题相关的知识,希望对你有一定的参考价值。

引用自 http://lishuaishuai.iteye.com/blog/2338341

javascript中,父元素包含子元素,当给父元素设置onmouseover或onmouseout事件时,鼠标从父级移入子级的时候会多次触发onmouseover事件;鼠标从子级移入父级后再次移出的时候也会多次触发onmouseout事件。所以这个问题要解决,不然在以后的事例中出现很大的问题。

下面我们首先要熟悉几个对象与方法:

1)事件对象:

2)事件对象相关属性(只针对onmouseover与onmouseout):

  标签源:oEvent.fromElement(从哪里来的元素):兼容IE,Chrome

      oEvent.toElement(去哪里的元素):兼容IE,Chrome

      oEvent.relateTarget(相关元素):兼容FF 

3)判断一个元素是不是包含在另一个元素中的方法:元素.contains(Node) 

解决方法

1.mouseenter与mouseleave事件来代替onmouseover与onmouseout事件。

  这个原文提到兼容问题,但我在Jquery中查到有mouseenter与mouseleave事件。所以我就用了Jquery的mouseenter来代替,亲测IE8,FF,Chrome都用。

2.//------------------------------------------------------------
function contains(parentNode, childNode) 
{
    if (parentNode.contains) {
        return parentNode != childNode && parentNode.contains(childNode);
    } else {
        return !!(parentNode.compareDocumentPosition(childNode) & 16);
    }
}
function checkHover(e,target)
{
    if (getEvent(e).type=="mouseover")  {
        return !contains(target,getEvent(e).relatedTarget||getEvent(e).fromElement) && !((getEvent(e).relatedTarget||getEvent(e).fromElement)===target);
    } else {
        return !contains(target,getEvent(e).relatedTarget||getEvent(e).toElement) && !((getEvent(e).relatedTarget||getEvent(e).toElement)===target);
    }
}
function getEvent(e){
    return e||window.event;

}

//把以上代码copy,然后在onmouseover="abc(event,this)"

function abc(e, obj)

{

  if(checkHover(e,obj)){

//..这里写你要做的事情即可。
        }

}

 

以上是关于Jquery mouseover多次触发问题的主要内容,如果未能解决你的问题,请参考以下文章

jq:mouseover和mouseout多次触发解决办法

jQuery mouseove和mouseout事件不断触发

jQuery mouseenter() 与 mouseover()

JS问题/jquery问题 如何让DIV里的元素不触发mouseover事件?

JQuery--mouseover()与moseout()的区别

jQuery mouseover与mouseenter,mouseout与mouseleave的区别