jQuery each () поведение при изменении DOM в цикле - PullRequest
1 голос
/ 19 января 2011

Каково поведение jquery при использовании каждого цикла ()? Это:

  1. поиск первого объекта, выполнение функции, поиск следующего объекта ...
  2. собрать все объекты в контейнере, затем выполнить функцию для каждого из них
  3. другое (что именно?)

Пример, где это уместно:

<div id="a">
   A
   <div id="b">
      B
   </div>
</div>
<div id="c">
    C
</div>

Если я выполню этот javascript:

$('div').each(function(index){
   alert($(this).html());
   $(this).remove();
}

Я увижу три оповещения или только два?

Ответы [ 3 ]

3 голосов
/ 19 января 2011

Независимо от того, какое действие вы будете выполнять над выбором, jQuery сделает этот выбор перед применением этого действия .Я имею в виду, что $('div') является селектором, процесс выбора происходит до и независимо от других связанных методов (таких как each()).Это продукт языка, так как $() должен быть оценен до того, как к нему может быть вызван метод.

Если этот выбор захватил три элемента div с вашей страницы, то теперь в списке 3 объекта jQueryготов к повторению. Вы можете доказать это, выполнив :

$('div').length

Таким образом, вы перебираете массив с тремя индексами (0, 1, 2), если вы удаляете div из DOM для индекса1, следующая итерация обратного вызова each() все еще будет для объекта с индексом 2. Проверьте это живое демо для доказательства:

DEMO: http://jsfiddle.net/marcuswhybrow/HYJa4/

0 голосов
/ 19 января 2011

2 - это ответ.

jQuery собирает список подходящих элементов, а затем перебирает список.

Однако важно отметить, что не удаляйте сопоставляемые элементы, которые еще не были обработаны, иначе вы рискуете получить ссылку не найден.

0 голосов
/ 19 января 2011

jQuery будет вести себя так, как вы описали в # 2.Вы увидите три предупреждения:

  1. "A
    B
    "
  2. "B"
  3. "C"

Однако, поскольку div B находится внутри div A, он будет удален с помощью div A. jQuery все еще знает об этом и сообщит о его содержимом, но к тому времени он уже будет удален.Таким образом, хотя вы получаете три предупреждения, у вас есть только два удаления (поскольку оно удаляет дочерние элементы).

...