Когда вы изменяете коллекцию jQuery внутри каждого l oop, включается ли измененная коллекция или только оригинал? - PullRequest
0 голосов
/ 26 мая 2020

Когда вы изменяете коллекцию jQuery внутри каждого l oop, включается ли измененная коллекция или только оригинал?

Например,

var collection = $("div");
$(collection).each(function(){
    var originalDiv = $(this);
    var cloneDiv = $(this).clone();
    cloneDiv.insertAfter(originalDiv);
});

Клонированные div теперь включены в l oop или это только исходная коллекция?

1 Ответ

0 голосов
/ 26 мая 2020

На объект jQuery в collection не влияют вызовы clone и insertAfter, которые вы выполняете в l oop. jQuery объекты являются снимками (например, те, которые вы получаете из querySelectorAll), а не живыми коллекциями (например, те, которые вы получаете из getElementsByTagName или getElementsByClassName или аналогичных), и ни clone, ни insertAfter не добавляют их на collection.

Вы легко можете себе это доказать:

// Your code (without the unnecessary `$()` around `collection`
var collection = $("div");
collection.each(function(){
    var originalDiv = $(this);
    var cloneDiv = $(this).clone();
    cloneDiv.insertAfter(originalDiv);
});

// Now, do another operation on the contents of `collection` -- notice how only
// the original contents are affected, not the divs created during the loop
collection.css("color", "blue");
<div>a</div>
<div>b</div>
<div>c</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Даже если вы использовали один из методов для добавления элемента к объекту jQuery, как правило, jQuery методы создают новые jQuery вместо изменения состояния объекта jQuery, который вы вызываете. (Я думаю, что есть исключения из этого правила, но одно не сразу приходит в голову.) Например, вы можете «добавить» элемент, вызвав add, но это не изменит вызываемый вами объект jQuery это на; вместо этого он создает и возвращает новый jQuery объект, содержащий исходные элементы и новый.

...