2016-10-02 62 views
2

內容我獲得使用功能importNode()一個HTML5 <template>的有源副本:的appendChild()從進口模板

function getTemplate() { 
    var t = document.getElementById("example"); 
    return document.importNode(t.content,true); 
    } 

在此之後,我填充動態數據,

var t = fillTemplate({ 
    id:"test", 
    text:"Enter test data" 
    }); 

,最後我將節點追加到目標容器中:

var c = document.getElementById("container"); 
    var result = c.appendChild(t); 

我的問題: result節點將刪除其所有內容:我無法訪問結果節點中模板的組件元素。實際上,result節點在完成appendChild操作後根本不包含任何子節點。

我期望appendChild的返回值應指向已插入到容器中的節點,該節點現在是活動文檔的一部分。任何解釋爲什麼不是這種情況?

這裏是的jsfiddle(在Chrome 53測試):

https://jsfiddle.net/rplantiko/mv2rbhym/

+0

如果jQuery的獲得,使用'克隆()' – Turtle

+2

@TurtIe我與著名的「香草JS」框架(0字節下載):-) 工作,我能得到什麼,我需要通過檢查後,容器中的' appendChild'操作。我只是想知道爲什麼我無法檢查appendChild的返回值。 – rplantiko

回答

2

也正是由於這樣的事實,你不操縱NodeDocumentFragment

如果你想得到插入節點的數量,你應該在父容器上執行調用(在你的例子中爲c),那麼你會得到正確的答案(5)。

但要算只有你加入,你不應該使用childNodes子元素,但ParentNode接口children的財產:

c.childNodes.length // = 5 
c.children.length // = 2 

被附加到容器c,該DocumentFragment的t後再也沒有孩子了。

MDN documentation

各種其它方法可利用一個文檔片段作爲參數 (例如,任何節點接口的方法,如Node.appendChild和 Node.insertBefore),在這種情況下,兒童的片段是 附加或插入DOM中插入 文檔片段的位置,而不是片段本身。 片段本身 繼續存在(在內存中),但現在沒有孩子。

DOM 3 W3C recommendation也很清楚:

此外,各種操作 - 如插入節點作爲孩子另一節點的 - 可採取的DocumentFragment對象作爲參數; 這導致DocumentFragment 的所有子節點爲 將移動到此節點的子節點列表。

+1

是的,'t'是一個文檔片段。但是在執行語句'c.appendChild(t)'之前,它*有*子 - 之後它是空的,就像操作的結果一樣。它爲什麼改變?它應該是對同一個片段的引用,與之前的內容相同 - 不是空的文檔片段節點。 – rplantiko

+0

它改變了一個DocumentFragment不能作爲一個節點,因爲它不是一個節點,所以你不能指望它有某種行爲。我已經添加了doc和spec的引用。 – Supersharp

+0

謝謝!所以這是一個「按設計案例工作」。 – rplantiko