2010-05-12 77 views
2

爲什麼thisjQuery的.append()函數

$("#mydiv").append("<ul>"); 
$("#mydiv").append("<li>Hello</li>"); 
$("#mydiv").append("</ul>"); 
alert($("#mydiv").html()); 

產生

<ul></ul><li>Hello</li>

,而不是

<ul><li>Hello</li></ul>

謝謝!

+0

你應該在這裏添加代碼。這樣即使外部資源消失,其他人也可以有機會看到整個問題。 – Juriy 2010-05-12 15:51:29

回答

2

因爲瀏覽器需要在每個追加之後(重新)建立自己的DOM。它不能知道結束標籤會晚些時候出現,並且開始標籤本身是無效的,因此在這種情況下糾錯將會關閉未關閉的元素。

這就是爲什麼innerHtml和依賴它的東西(如jQuery的append方法)不可靠,應儘可能避免的原因之一。

+0

爲了清楚起見,如果你傳遞HTML字符串片段,append只依賴於innerHtml。追加本身附加一個DOM節點;如果你傳入一個HTML字符串,它使用innerHTML創建一個DOM節點,然後像這樣附加。 – 2010-05-12 17:40:33

7

Append()追加DOM節點,而不是HTML標籤(即,它是一個對象追加,而不是字符串追加)。

當您追加<ul>時,您將創建一個完整的UL節點,並且包含開始和結束標記。 </ul>調用被忽略。

+0

更好地說* HTML標記*而不是* HTML元素*。 – Gumbo 2010-05-12 15:45:10

+0

謝謝,糾正。 – richardtallent 2010-05-12 15:48:06

+0

嚴格來說,並不是每個HTML元素都是一個標籤。你可以附加一個TextNode,它不是:-) – Juriy 2010-05-12 15:50:36

2

因爲你不能附加未完成的HTML片段,所以你總是追加元素。對於你的情況,你有做任何

$("#mydiv").append("<ul></ul>"); 
$("#mydiv ul").append("<li>Hello</li>"); 

$("#mydiv").append("<ul><li>Hello</li></ul>");