簡體   English   中英

設置document.body.outerHTML會創建空頭。 為什么?

[英]Setting document.body.outerHTML creates empty heads. Why?

重置document.body outerHTML屬性有一個奇怪的副作用:它在DOM中添加額外的空<head></head> ,就在body之前:

 head { display: inline; counter-increment: h; border: 1px solid; } head:last-of-type::after { content: 'Head elements count: ' counter(h); } [onclick]::after { content: attr(onclick); } 
 <button onclick="document.body.outerHTML=document.body.outerHTML"></button> 

所有瀏覽器似乎都是一致的。 被告知它被指定為這種方式,但是無法在這個問題上挖掘權威的標准立場,甚至在討論檔案中都​​沒有提及。 你知道這方面的背景嗎,還是有一些技術原因必須這樣? 任何想法?

有趣的問題。 遺憾的是,解釋隱藏在HTML片段解析算法的細節中,該算法從DOM解析規范中的outerHTML的定義中引用。

您需要非常仔細地遵循解析器狀態以查明原因,但實際上它的工作原理與此類似。 使用outerHTML,解析器被初始化,就像它剛剛解析了給定節點的父節點的開始標記一樣。 對於document.body,這是html元素。

在HTML解析算法中,當解析html開始標記時,解析器期望的下一個是head元素。 但是因為在HTML中,head元素的開始和結束標記是可選的,如果它接下來沒有看到head start標記,則它會推斷出一個。 因此,對於document.body.outerHTML,解析器看到的下一件事是body start標記,因此首先創建一個空頭元素。

最后,一旦解析了片段,整個批次(包括推斷的head元素)就會被添加到DOM中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM