2012-02-17 47 views
5

有沒有辦法將標記字符串轉換爲JavaScript中的節點對象?其實我在尋找替補多爲:從標記字符串創建節點

document.getElementById("divOne").innerHTML += "<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>" 

使用createNodeFromString而創建表元素,然後追加其子元素再附上各自的屬性和值
document.getElementById("divOne").appendChild(document.createNodeFromString("<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>")) 

+1

我很好奇爲什麼設置innerHTML不適合你。設置innerHTML後,您可以通過查詢您的divOne來獲取結果元素。 – akonsu 2012-02-17 20:08:16

+0

@akonsu,據說你在divOne中有,在這個div之外你有一個onclick = innerHTML-method的按鈕。現在,在FF10和IE9(使用文檔模式IE9)中輸入文本框中的內容並按下按鈕,輸入的值將被重置!我試圖看到appendChild會發生同樣的事情。順便說一句,在IE8兼容模式下,輸入元素的值是持久的。 – 2012-02-17 20:17:51

+0

你是說如果你有一個文本輸入框和一個按鈕,當你按下按鈕時,輸入框的值會被清除?你可以證明這一點,比如jsbin.com? – akonsu 2012-02-17 20:26:34

回答

15

現在還沒有一個現有的跨瀏覽器功能。下面的方法可用於實現期望的效果(使用DocumentFragment用於優化的性能,基於this answer):

function appendStringAsNodes(element, html) { 
    var frag = document.createDocumentFragment(), 
     tmp = document.createElement('body'), child; 
    tmp.innerHTML = html; 
    // Append elements in a loop to a DocumentFragment, so that the browser does 
    // not re-render the document for each node 
    while (child = tmp.firstChild) { 
     frag.appendChild(child); 
    } 
    element.appendChild(frag); // Now, append all elements at once 
    frag = tmp = null; 
} 

用法(縮進表示可讀性):

appendStringAsNodes(
    document.getElementById("divOne"), 
    "<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>" 
); 
+0

丹迪!感謝這個出色的解決方法。 – 2012-02-17 20:42:34

2

是的,可以去做。

var myNewTable = document.createElement("table"); 
myNewTable.innerHTML = "<tbody><tr><td><input type='text' value='0' /></td></tr></tbody>" 
document.getElementById("divOne").appendChild(myNewTable); 
+0

舊的IE版本會抱怨這一點,因爲它們無法處理在某些元素上設置'innerHTML'屬性,包括'

'。另請參閱[本文](http://support.microsoft.com/kb/239832)。 – 2012-02-17 20:31:10