您的当前位置:首页正文

javascript中mouseover、mouseout使用详解

2022-02-02 来源:钮旅网
javascript中mouseover、mouseout使⽤详解

本⽂并没有像标题说的那样,真正阻⽌事件元素的⼦元素冒泡...

只是在⼦元素冒泡到事件元素处时进⾏了⼀个判断,判断是否要触发事件,哦...不对 应该是是否要运⾏事件函数中的相关操作...

⾸先你可以猛戳这⾥:

注:jquery中的mouseover/out事件也有此问题解决⽅法⼀:

在ie下有mouseenter 与 mouseleave事件来替代mouseover 和 mouseout。⽹上很多说法,这两个事件只有ie⽀持,其他浏览器不⽀持。

但是我在最新版本的⽕狐与⾕歌都⽀持了mouseenter 与 mouseleave另外ie是的⽀持范围是:[ie5+ ,所以我们还是别喷ie了...其他浏览器测试了下:

      在Firefox/3.6.28是不⽀持mouseenter 与 mouseleave的,Firefox具体从哪个版本开始⽀持这两个事件,就不得⽽知了...

在Opera9.50 Alpha 与Opera9.00 Beta都不⽀持。其实Opera现在完全可以不要测试了,最新版的Opera都是webkit内核...

      ⾕歌低版本未测试...

当然这些⽼版本浏览器基本可以不⽤管了,所以这应该是最好的解决办法了:⽤mouseenter 与 mouseleave事件来替代mouseover 和 mouseout。

此⼆事件的实例戳这:mouseenter与mouseleave

注:jquery中也有mouseenter 与 mouseleave事件,兼容所有浏览器。解决⽅法⼆:

上⾯那个⽅法在⽼版本的⽕狐与⾕歌是不⽀持的,如果你希望得到最⼤范围的兼容,那可以继续往下看

我们利⽤var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement 来获取事件相关元素。再通过这个事件相关元素它跟事件元素的关系(包含的关系),来判断是否做相关事件处理。对于mouseout事件来说,reltg就是⿏标指针离开⽬标时,⿏标指针进⼊的节点。对于mouseover 事件来说,reltg就是⿏标指针移到⽬标节点上时所离开的那个节点。

在li的mouseout的事件函数中,如果reltg为li的⼦元素我们就不要运⾏相关操作,如果reltg为li的⽗元素就运⾏相关操作。我们可以通过下⾯的isMouseLeaveOrEnter函数来判断li与reltg的包含关系:

//判断事件相关元素与li的关系 如果事件相关元素为li的⼦元素就返回false 反之返回truefunction isMouseLeaveOrEnter(e, handler) {

  if (e.type != 'mouseout' && e.type != 'mouseover') return false;

  var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement;  while (reltg && reltg != handler) reltg = reltg.parentNode;  return (reltg != handler);};

Li.onmouseout = function(e) {  e = e||window.event;

  if (isMouseLeaveOrEnter(e,this)) {    //运⾏相关操作  };}

此⽅法明显的缺点就是isMouseLeaveOrEnter中要遍历所有的⽗元素了,性能问题解决⽅法三:

此⽅法与⽅法⼆其实思路是⼀样的,只是我们这⾥通过compareDocumentPosition/contains来判断li与reltg的包含关系,优化了⽅法⼆遍历所有⽗元素带来的性能问题。直接看代码吧:

//判断node是否为parent的⼦元素//if node == parent 也会返回truefunction contains(parent, node) {

  if(parent.compareDocumentPosition){ //ff

    var _flag = parent.compareDocumentPosition(node);     return (_flag == 20 || _flag == 0)? true : false;   }else if(parent.contains){ //ie

    return parent.contains(node);  }};

Li.onmouseout = function(e) {  e = e||window.event;

  var relatedEle = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement  if (!contains(this, relatedEle)) {

    show.innerHTML=show.innerHTML+'0';  }}

compareDocumentPosition() ⽅法⽐较两个节点,并返回描述它们在⽂档中位置的整数。返回值可能是:

1:没有关系,两个节点不属于同⼀个⽂档。2:第⼀节点(P1)位于第⼆个节点后(P2)。4:第⼀节点(P1)定位在第⼆节点(P2)前。8:第⼀节点(P1)位于第⼆节点内(P2)。16:第⼆节点(P2)位于第⼀节点内(P1)。32:没有关系,或是两个节点是同⼀元素的两个属性。

注释:返回值可以是值的组合。例如,返回 20 意味着在 p2 在 p1 内部(16),并且 p1 在 p2 之前(4)。

⽽[ie8- 不⽀持compareDocumentPosition()⽅法,需要⽤contains代替compareDocumentPosition()⽅法那么强⼤,它是⽤来确定 nodeB 是否包含在另⼀个 nodeA 中:nodeA .contains( nodeB )以上所述就是本⽂的全部内容了,希望⼤家能够喜欢。

因篇幅问题不能全部显示,请点此查看更多更全内容