jQuery的.not()在纯JavaScript中的等效是什么?

6

我正在尝试创建一个循环,将类添加到列表中。我希望这个类被添加到除被点击的元素外的所有元素上。我在网上找到了以下内容:

$('.elements').click(function(){
     $('.elements').not(this).each(function(){
         // do something
     });
})

是否有类似于原生JavaScript的替代品?我找不到从.not()转换的方法。


5
据我所知,没有现成的,你需要自己构建。 - elclanrs
3个回答

6

最接近的等价物可能是Array.prototype.filter,它允许您使用一个函数测试数组的每个元素:

var elementToExclude = something;
arrayOfElements.filter(function (elem) {
    return elem !== elementToExclude;
}).forEach(doSomething);

2
这里非常挑剔,但值得指出的是,这不能与NodeList一起使用(需要使用[].filter.call(arrayOfElements, function(elem){}))。我知道你说了arrayOfElements,只是想指出给其他人阅读。 - benhowdle89
@benhowdle89 - 是的,说得好。我更多地考虑了一下如果给定了OP的jQuery集合,然后在其上调用.get(),你最终会得到什么数组。 - James Allardice
好的,我理解了。我只是假设因为 OP 要求一个非 jQuery 的解决方案,所以所有的东西都需要是非 jQuery 的。就像我说的,这里真的很挑剔! - benhowdle89
你可以使用 Array.prototype.filter.call(nodeList, function() {}) 来处理 NodeList 元素。 - Eriks

6
您好!您所提供的完整代码版本的基础版如下。没有助手为每个元素添加点击监听器时,这种方式相当冗长(TBH表示“说实话”)。

var els = document.querySelectorAll('.elements');
[].forEach.call(els, function(el, i, els) {
    el.addEventListener('click', function() {
        [].forEach.call(els, function(el) {
            if(el !== this) {
                // do something
            }
        }, this);
    });
});

1

您应该分析点击事件。观察目标和currentTarget属性。

jsfiddle

document.getElementById('test').addEventListener('click', function (event) {
    if (event.target !== event.currentTarget) {
        do something
    } else {
        don't do something
    }
});

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