2015-11-16 4 views
0

Объяснение на примере:Как обновить функцию jQuery .each()?

$(selector).each(function() { 
    if (expression) { 
     $(this).next().remove(); 
    } 
    .... 
}); 

На основе expression я удалить элемент, который также является частью selector, и в действительности является удалением следующего элемента функция .each() получит.

Функция .each(), похоже, не заботит и не запускает ее код на удаленном элементе, нарушающем процесс итерации моего кода в каждой функции. В основном значение счетчика в функции .each() будет считать удаленный элемент, даже если он не должен.

Есть ли способ обновить или обновить функцию .each(), чтобы она пропускала элементы, которые были удалены после ее инициирования?

ответ

2

Лучше filter ваши элементы перед:

$(selector).filter(function() { 
    if (expression) { 
    return false; 
    } 
}).each(function() { .. }); 

Я не думаю, что вы можете изменить коллекцию из внутри в each вызова.

Даже лучше, вы можете разделить это на два вызова, так как если вы сделаете все это только один вызов, селектор будет кэшировать:

$(selector).filter(function() { 
    return expression; 
}).next().remove(); 

// and then 

$(selector).each(function() { ... }); // now *without* removed elements. 
+0

Да, но я должен удалить элемент из DOM, не удаляйте его из функции .each(), поэтому фильтр не поможет. Теперь я думаю о запуске каждой функции в два раза. – Espen

+1

@Espen Что не так: '$ (selector) .filter (function() { return expression; }). Next(). Remove();' ??? На самом деле, можете ли вы предоставить образец, показывающий ожидаемое поведение? Я не уверен, почему вы не могли просто отфильтровать его. –

+0

Мне нужно удалить следующий элемент, если атрибут соответствует текущему элементу. Эффект, который я получаю, состоит в том, что между двумя соседними элементами нет двух соответствующих элементов. В списке это может быть начало группы, если два запуска находятся рядом друг с другом, тогда группа пуста и может быть удалена. Я не знаю ни одного фильтра, который может это сделать. Проблема заключается не в том, чтобы что-либо фильтровать, а в том, как обращаться с элементом в функции .each(), удаляемой из DOM после инициализации. – Espen

0

Первый раз, когда вы запроса DOM с $(selector) вы возвращаются коллекции jQuery, содержащие все элементы (в частности, ссылки на элементы), которые удовлетворяют этому селектору. Любые изменения в DOM не влияют на эту коллекцию. Если вам удастся изменить DOM таким образом, чтобы элементы в коллекции больше не удовлетворяли начальному селектору, это не будет отражено.

Правильное решение этой проблемы - не изменять DOM в каждом цикле и в основном найти другой способ решить вашу проблему. Но простой (вычислительно дорогой) решение только перепроверить элемент на начальном селектором при итерации ... вы можете использовать метод .is для достижения этой цели:

$(selector).each(function() { 
    var $this = $(this); 
    if ($this.is(selector)) { 
     if (expression) { 
      $this.next().remove(); 
     } 
    } 
    .... 
}); 
+0

@ Оник для вас – sahbeewah

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