2016-02-15 3 views
2

Недавно я встретил проблему с функцией .Не(), это код:JQuery .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); 

Проблема: ('тест') Иногда, когда элемент $ который также обновляет класс в цикле.

Что я думаю: это означает, что переключатель not() не работает?

Так что я хотел бы знать, что ДЕЙСТВИТЕЛЬНО проблема с кодом?

+0

Есть ли у вас вложенный класс 'test'? – Azim

ответ

4

Ваш код находит все элементы с классом «test», а затем исключает те, которые также имеют класс «обновлен».

Затем, для каждого из этих элементов, вы делаете еще.find() операция для поиска элементов с классом «тест». Это, однако, не включает вызов .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(), который начнется сначала и найдет все элементы с классом «тест» на всей странице.

+0

Спасибо за ваш ответ, это моя ошибка, я забыл сказать, что я хочу дозировать, после добавления обновленного класса, поэтому цикл не только используется для добавления класса, но и я уже меняю вопрос, поэтому в этом состоянии, Знаете ли вы, что не так? – llyjy21

+0

@ llyjy21 ваш код по-прежнему имеет ту же основную проблему. Каждый вызов '$ (". Test ")' возвращается к * whole * DOM, чтобы найти все элементы с классом «test». – Pointy

+0

Большое спасибо, я думаю, что понимаю сейчас – llyjy21

0

Вы используете .find(), который используется для выбора всех потомков этого элемента.

.find() См

Таким образом, в вашем случае, сценарий класса .test без класса .updated будет искать во всех своих детей, чтобы найти класс .test и это добавит класс updated к нему. Итак, все дети, независимо от того, имеют ли они класс .updated, .updated, будут добавлены к нему.

Следовательно, то, что вы хотите сделать, может быть просто достигнуто следующим образом:

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

или почему не просто,

$('.test').not('.updated').addClass('updated'); 
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); 

Как вы обратитесь cing в каждом $('.test'), который является всем классом испытаний .updated, или иначе это причина, по которой класс .updated все еще возникает в цикле

Смежные вопросы