事件委托,Event.target与Event.currentTarget的区别

5

MDN Event.target 参考文档 中,有一个关于实现事件委托的示例:

事件委托示例

// Assuming there is a 'list' variable containing an instance of an  
// HTML ul element.
function hide(e) {
    // Unless list items are separated by a margin, e.target should be  
    // different than e.currentTarget
    e.target.style.visibility = 'hidden';
}

list.addEventListener('click', hide, false);

// If some element (<li> element or a link within an <li> element for  
// instance) is clicked, it will disappear.
// It only requires a single listener to do that

示例中不清楚的部分

我在示例中不理解的是这个注释:

// Unless list items are separated by a margin, e.target should be  
// different than e.currentTarget

问题

如何使用 <li> 元素上的 margin 区分 Event.targetEvent.currentTarget

1个回答

6
请注意,根据MDN Event.currentTarget reference所述,event.targetevent.currentTarget的区别在于:

如果没有边距,则不可能直接单击

    ,因为
  • 元素将完全填充其空间。

    如果存在边距,则至少可以单击

      ,此时event.targetevent.currentTarget将相同。

      function hide(e) {
          document.querySelector("pre").textContent += 'e.target = ' + e.target.nodeName + ", e.currentTarget = " + e.currentTarget.nodeName + "\n";
      }
      
      document.querySelector("#list").addEventListener('click', hide, false);
      ul {
        border: 2px solid orange;
      }
      li {
        padding: 10px;
        color: blue;
        margin: 30px;
        border: 1px dashed blue;
      }
      <pre></pre>
      <ul id="list">
        <li>click me
        <li>click me
        <li>click me
      </ul>


1
我理解不好的一个重要原因是我没有读到这句话:"event.currentTarget 总是指向事件处理程序所附加的元素,而 event.target 则标识发生事件的元素。" - 来自 https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget 也许你可以将这句话添加到你的答案中,以便未来搜索此主题时使用。谢谢! - maljukan
@l0lander:这是一个社区维基,随意根据需要进行编辑。 - user1106925

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接