2015-03-30 4 views
1

Первый журнал возвращает полный элемент li, а второй возвращает пустой DocumentFragment. Зачем? Я не мог найти никакой информации об этом поведении в любой документации.Почему DocumentFragment очищается после добавления

<template id="my-template"> 
    <li>foo</li> 
</template> 

<ul id="main"> 
</ul> 

<script> 
    var main = document.getElementById('main'); 
    var fooTemplate = document.getElementById('my-template'); 
    var foo = fooTemplate.content.cloneNode(true); 

    console.log(foo); 
    main.appendChild(foo); 
    console.log(foo); 
</script> 

ответ

1

From the MDN docs on DocumentFragment

Различных другие способы могут взять фрагмент документа в качестве аргумента (например, любые методы Node интерфейса, таких как Node.appendChild и Node.insertBefore), и в этом случае дети фрагмента прилагаемых или а не сам фрагмент.

foo = fooTemplate.content.cloneNode(true) копирует фрагмент документа в foo.

main.appendChild(foo) перемещает содержимого из фрагмента foo документа в main. foo остается фрагментом документа, и все узлы перемещены так, что он пуст.

Если вы хотите сохранить ссылку на узлы DOM после их добавления, вам необходимо сохранить childNodes, но если вы просто ссылаетесь на nodeList, он будет пустым, поэтому вам нужно будет преобразовать его в Array:

var nodes = Array.prototype.slice.call(foo.childNodes); 
console.log(nodes); 
main.appendChild(foo); 
console.log(nodes); 
+0

Ну, он по-прежнему возвращает тот же результат ... – Lithy

+2

@Lithy, о, я вижу сейчас. Я говорил слишком рано. 'fooTemplate.content.cloneNode (true)' клонирует фрагмент документа. Добавление фрагмента документа перемещает содержимое, оставляя вам пустой фрагмент документа. – zzzzBov

+1

Я думаю, вы не должны использовать термин «копировать» здесь. Либо они «перемещены», либо «клонированы». – Bergi

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