当前和未来元素的事件侦听器没有 jQuery

Event listener for current and future elements Without jQuery

如果我没记错的话,我曾经看到一种方法可以将事件侦听器绑定到符合特定条件的每个元素,也许是查询选择器。再次寻找它,除了高度依赖 jQuery 的人之外,我找不到任何东西,但我更喜欢一种真正简单的方法来实现这一目标。

有人知道这个方法叫什么吗?

您正在寻找的方法称为事件捕获。你可以这样做:

document.querySelector('body').addEventListener('click', function(evt) {
    // Do some check on target
    if ( evt.target.classList.contains('some-class') ) {
        // DO CODE
    }
}, true); // Use Capturing

我写了一个更通用的函数,它接受一个选择器、事件类型和一个处理函数,类似于 jQuery 的 on 函数:

/** adds a live event handler akin to jQuery's on() */
function addLiveEventListeners(selector, event, handler){
    document.querySelector("body").addEventListener(
         event
        ,function(evt){
            var target = evt.target;
            while (target != null){
                var isMatch = target.matches(selector);
                if (isMatch){
                    handler(evt);
                    return;
                }
                target = target.parentElement;
            }
        }
        ,true
    );
}

例如,对于 div 的任何点击都会调用以下代码,即使它后来被添加到 DOM:

addLiveEventListeners("div", "click", function(evt){ console.log(evt); });

这适用于所有现代浏览器和 Microsoft Edge。为了让它在 IE9 中工作——IE11 测试 target.matches(selector) 应该像这样修改:

var isMatch = target.matches ? target.matches(selector) : target.msMatchesSelector(selector);

然后测试 if (isMatch) 也适用于这些浏览器。

另请参阅我对 Adding event listeners to multiple elements 的回答,它将事件侦听器添加到元素本身而不是添加到 body