Добавете възли към фрагмента на документа заедно с маркери за прекъсване

Странна ситуация, не можах да намеря решение онлайн. Имам някои innerHTML вътре в contentEditable област, която се опитвам да добавя към фрагмент на документ...и да запазя формата, който включва маркери за прекъсване. Когато правя това:

var d = document.createDocumentFragment();
var content = document.getElementById('content').getElementsByTagName('*');
console.log(content);
//this logs (img, br, span, br, img, br, span) ~ I shortened the output to just tags
for (var i = 0; i < content.length; i++) {
    (function(iCopy) {
        d.appendChild(content[iCopy]);
    })(i);
}
console.log(d);

Последният дневник се връща (img, span, img, span). Защо цикълът не разпознава етикетите за прекъсване и какво мога да направя, за да ги добавя към фрагмента на моя документ?

Когато влизам, без да добавя нищо към фрагмента, така:

var content = document.querySelector('#content');
for (var i = 0; i < content.children.length; i++) {
    console.log(content.children[i].tagName);
    //d.appendChild(content.children[i]);
}

Получавам "img, br, span, br, img, br, span". Щом разкоментирам appendChild, прекъсванията изчезват. Защо??

Моето решение:

var d = document.createDocumentFragment();
var content = document.querySelector('#content');
while (content.children.length > 0) {
    d.appendChild(content.children[0]);
}
console.log(d);

person denikov    schedule 03.07.2015    source източник


Отговори (1)


Когато добавяте елементи към documentFragment, вие ги премахвате от DOM, което кара колекцията, която итерирате, да се актуализира и индексира повторно.

Ако елементите <br> са всеки друг, тогава естествено те ще бъдат пропуснатите поради повторното индексиране.

За да го поправите, итерирайте в обратен ред, така че да се отдалечите от повторното индексиране вместо към него.

for (var i = content.length-1; i > -1; i--) {
    d.appendChild(content[i]);
}

FYI, премахнах незабавно извиканата функция, защото е безсмислена.


Трябва да знаете, че това изравнява всички DOM възли в списъка. Ако има вложени възли, те вече няма да бъдат вложени.

person Community    schedule 03.07.2015
comment
Току-що направих while (content.children.length > 0) {d.appendChild(content.children[0]);}. Това има смисъл сега, когато разбирам, че се индексира отново - person denikov; 03.07.2015