我最近遇到了.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()选择器不起作用?
所以我想知道什么是真正的代码问题?
答案 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');