jQuery .not()函数不起作用

时间:2016-02-15 18:24:15

标签: javascript jquery html css

我最近遇到了.not()函数的问题,这是代码:

var interval = setInterval(function() {
        $('.test').not('.updated').each(function(){
                var $parentDiv = $('.test').parent('div');
                // do something
                parentDiv.find('.test').addClass("updated"); 
                //Above: change this element's status
        });
}, 3000);

问题是: 有时当元素$('。test')在循环中也有'更新'类。

我的想法: 这意味着not()选择器不起作用?

所以我想知道什么是真正的代码问题?

3 个答案:

答案 0 :(得分:4)

您的代码正在查找具有“test”类的所有元素,然后排除那些也具有“已更新”类的元素。

然后,对于每个元素,您正在执行另一个 .find()操作,以查找具有类“test”的元素。但是,这不包括.not()调用,所以如果你有一个元素,其中“test”类嵌套在另一个元素中,那么无论它是否已经“更新”了类,它都会受到影响。

我认为你的代码应该是这样的:

var interval = setInterval(function() {
        $('.test').not('.updated').addClass("updated");
}, 3000);

您不需要.each(),因为.addClass()会为您做到这一点。

编辑 - 如果您确实需要在.each()内完成更多工作,您的代码将如下所示:

var interval = setInterval(function() {
        $('.test').not('.updated').each(function(){
                var $parentDiv = $(this).parent('div');
                // do something
                $(this).addClass("updated"); 
                //Above: change this element's status
        });
}, 3000);

.each()回调中,this将绑定到外部jQuery序列中的每个选定元素:具有类“test”但不是“更新”类的元素集。如果您在$(".test")回调中再次使用.each() ,则会重新开始,并在整个页面中找到所有类别为“test”的元素。

答案 1 :(得分:1)

这是您的更新功能,在每个循环中使用$(this)代替$('.test')

var interval = setInterval(function() {
        $('.test').not('.updated').each(function(){
                var $parentDiv = $(this).parent('div');
                // do something
                $(this).addClass("updated"); 
                //Above: change this element's status
        });
}, 3000);

当您在每个$('.test')中引用时,这是所有测试类.updated或其他原因.updated类仍然在循环中出现

答案 2 :(得分:0)

您正在使用.find(),用于选择该元素的所有后代。

  

参考.find()

因此,在您的情况下,方案是类.test,而没有类.updated将在其所有子项中搜索类.test,它将添加类updated到它。因此,所有孩子是否会加入课程.updated.updated课程。

因此,您可以通过以下方式实现您想要做的事情:

 $('.test').not('.updated').each(function(){
   $(this).addClass("updated");
 });

或者为什么不简单,

$('.test').not('.updated').addClass('updated');