gpt4 book ai didi

javascript - Vanilla JavaScript 事件委托(delegate)

转载 作者:可可西里 更新时间:2023-11-01 02:39:34 26 4
gpt4 key购买 nike

在 vanilla js 中进行事件委托(delegate)的最佳(最快/正确)方式是什么?

例如,如果我在 jQuery 中有这个:

$('#main').on('click', '.focused', function(){
settingsPanel();
});

我怎样才能将它翻译成 vanilla js?也许用 .addEventListener()

我能想到的方法是:

document.getElementById('main').addEventListener('click', dothis);
function dothis(){
// now in jQuery
$(this).children().each(function(){
if($(this).is('.focused') settingsPanel();
});
}

但这似乎效率低下,尤其是当 #main 有很多 child 时。

那么这是正确的方法吗?

document.getElementById('main').addEventListener('click', doThis);
function doThis(event){
if($(event.target).is('.focused') || $(event.target).parents().is('.focused') settingsPanel();
}

最佳答案

I've come up with a simple solution 这似乎工作得相当好(尽管有旧版 IE 支持)。在这里,我们扩展了 EventTarget 的原型(prototype)以提供一个 delegateEventListener 方法,它使用以下语法工作:

EventTarget.delegateEventListener(string event, string toFind, function fn)

我创建了一个相当复杂的 fiddle 来演示它的实际效果,我们将所有事件委托(delegate)给绿色元素。停止传播继续有效,您可以通过 this(与 jQuery 一样)访问应该是 event.currentTarget 的内容。

这里是完整的解决方案:

(function(document, EventTarget) {
var elementProto = window.Element.prototype,
matchesFn = elementProto.matches;

/* Check various vendor-prefixed versions of Element.matches */
if(!matchesFn) {
['webkit', 'ms', 'moz'].some(function(prefix) {
var prefixedFn = prefix + 'MatchesSelector';
if(elementProto.hasOwnProperty(prefixedFn)) {
matchesFn = elementProto[prefixedFn];
return true;
}
});
}

/* Traverse DOM from event target up to parent, searching for selector */
function passedThrough(event, selector, stopAt) {
var currentNode = event.target;

while(true) {
if(matchesFn.call(currentNode, selector)) {
return currentNode;
}
else if(currentNode != stopAt && currentNode != document.body) {
currentNode = currentNode.parentNode;
}
else {
return false;
}
}
}

/* Extend the EventTarget prototype to add a delegateEventListener() event */
EventTarget.prototype.delegateEventListener = function(eName, toFind, fn) {
this.addEventListener(eName, function(event) {
var found = passedThrough(event, toFind, event.currentTarget);

if(found) {
// Execute the callback with the context set to the found element
// jQuery goes way further, it even has it's own event object
fn.call(found, event);
}
});
};

}(window.document, window.EventTarget || window.Element));

关于javascript - Vanilla JavaScript 事件委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23508221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com