[关闭]
@15013890200 2018-09-05T14:51:15.000000Z 字数 1140 阅读 839

解决onmouseover和onmouseout在内部触发父元素相应事件问题

mouse事件 prototype dom

场景描述:开发中经常遇到,鼠标 移入/移出 某块元素触发相应事件。假如该元素包含很多相关子元素。当鼠标移入相关子元素时,会触发父元素的鼠标移出事件,当鼠标从子元素直接不经过父元素(子元素在父元素边界)移出时,并不会触发父元素的移出事件。
这个问题一直都有遇到过,之前的做法,既笨拙又复杂:就是父元素的移出事件做成定时任务。当移入子元素时就取消还未完成的定时任务。这样做耗性能且不能够做到及时。现在已经用一个更妥帖的方法来处理类似问题。


大致思想:
1、当父元素触发onmouseout事件时判断此时的event.toElement元素是否是父元素的子节点
2、在节点元素原型上定义一个判断元素是否是调用元素的子元素方法。(也可以将其定义成一个公用方法)

  1. //方式一:在节点元素原型上定义。调用 parentDom.containEle(dom)
  2. HTMLElement.prototype.containEle = function(dom){
  3. while(dom && (typeof dom)){
  4. if(dom == this) return true;
  5. dom = dom.parentNode;
  6. }
  7. }
  8. //方式二:定义成公用方法。调用 containEle(parentDom,dom)
  9. function containEle(parentDom,dom){
  10. while(dom && parentDom){
  11. if(dom == parentDom) return true;
  12. dom = dom.parentNode;
  13. }
  14. }

实际应用

  1. <div class='parent'>
  2. <div class='son'></div>
  3. </div>
  4. <script>
  5. let parent = document.querySelector('.parent');
  6. let son = document.querySelector('.son');
  7. parent.onmouseover = function(){
  8. //....
  9. };
  10. parent.onmouseout = function(event){
  11. let toEle = event.toElement;
  12. if(!parent.containEle(toEle)){
  13. //鼠标已经离开父元素所在区域,定义相关操作
  14. }
  15. else{
  16. //鼠标只是进入子元素所在区域,并未离开父元素所在区域。(通常情况下不作处理)
  17. }
  18. }
  19. son.onmouseout = function(event){
  20. let toEle = event.toElement;
  21. if(!parent.containEle(toEle)){
  22. //鼠标已经离开父元素所在区域,定义相关操作
  23. }
  24. }
  25. </script>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注