使用addEventListener和按钮中的嵌套元素的事件委派模式

时间:2016-03-21 00:02:12

标签: javascript javascript-events

我在父母中有一组按钮。每个都包含一个以编程方式添加的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中这样做。

任何帮助都会受到大力赞赏。

1 个答案:

答案 0 :(得分:2)

我想最简单的方法就是拥有像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>