关于mouseover和mouseout事件的处理

当鼠标进入和离开一个节点的时候,mouseover和mouseout事件都会被分别激活。然而我们并不能按照字面意思简单地调用这两个事件。因为,当鼠标从一个节点进入它的子节点的时候,mouseout事件也会被激活,同时,当鼠标从子节点移出的时候,由于事件冒泡机制,mouseout事件会再次被激活,显然这样的情况并不是我们想要的。

解决这个问题,我们可以使用事件对象的一个relatedTarget 属性,它的定义是这样的:”in the case of “mouseover”, what element the pointer was over before and, in the case of “mouseout”, what element it is going to.” 在mouseover事件中,它指的是鼠标进入节点之前的那个元素;在mouseout事件中,它指的鼠标即将进入的那个元素。总之,relatedTarget所指的这个节点是在我们的目标节点之外的。 所以我们可以这样处理一个鼠标划过字体变色的问题。

<p>Hover over this <strong>paragraph</strong>.</p>
<script>
  var para = document.querySelector("p");
  function isInside(node, target) {
    for (; node != null; node = node.parentNode)
      if (node == target) return true;
  }
  para.addEventListener("mouseover", function(event) {
    if (!isInside(event.relatedTarget, para))
      para.style.color = "red";
  });
  para.addEventListener("mouseout", function(event) {
    if (!isInside(event.relatedTarget, para))
      para.style.color = "";
  });
</script>

当然对于这个问题,我们可以使用css 的伪类hover进行简单处理,这里只是举一个例子,如果遇到更复杂的情况,我们可以这种方法来规避一些问题。

Written on April 26, 2017