【问题标题】:Event Delegation Pattern with addEventListener and nested elements in buttons带有 addEventListener 和按钮中的嵌套元素的事件委托模式
【发布时间】:2016-03-21 00:02:11
【问题描述】:

我在父级中有一组按钮。每个都包含一个以编程方式添加的 SVG 图标。我正在尝试监听父元素,然后使用事件委托来触发特定按钮的不同功能,但最终发生的是我得到了包含的 svg 或路径的事件目标,而不是按钮本身。有没有办法利用事件冒泡,或者改变我这样做的方式仍然避免添加大量事件处理程序并触发我需要的事件?下面是一些简化的代码:

<div class="parent">
    // I have a whole lot of these added to the page programmatically
    <button class="some-unique-class">
        <svg> //... </svg>
    </button>
</div>

然后在我的 JavaScript 中:

document.querySelector('.parent').addEventListener('click', function(event) {

    //.. I always want to trigger events on the buttons, not
    // on the svg's and their paths.  
});

使用 JQuery,我可以通过侦听父元素然后指定元素来轻松地做到这一点,但我想在 vanilla JS 中做到这一点。

任何帮助将不胜感激。

【问题讨论】:

  • 在使用事件委托时,基本上总是要检查目标是否是按钮的子节点。
  • 我也这么认为。

标签: javascript dom-events


【解决方案1】:

我想最简单的方法是拥有像 jquery 的closest 这样的函数:

function closest(elem, selector) {
  do {
    if(elem.matches(selector)) return elem;
    elem = elem.parentNode;
  } while(elem);
}


document.querySelector('.parent').addEventListener('click', function(e) {

  var btn = closest(e.target, 'button');
  btn.style.backgroundColor = 'red';
  
});
<div class="parent">
    <button class="some-unique-class">
        <b>hey</b>
    </button>
    <button class="some-unique-class">
        <b>hey</b>
    </button>
</div>

【讨论】:

  • 好吧,我想是的,这是标准方式吗?我注意到目标还包含一个路径对象,该对象包含它返回文档的每个元素,所以我正在考虑尝试使用它。
  • closest 是内置的。
猜你喜欢
  • 1970-01-01
  • 2012-12-18
  • 2015-12-08
  • 1970-01-01
  • 2014-11-25
  • 2010-11-22
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多