2017-10-17 63 views
0

結束腳本標籤造成鉻解析錯誤

var c= {"Content":"</SCRIPT>"}

給出了Chrome的解析錯誤。 逃離作品... </SCRIPT>

https://jsfiddle.net/OndrejSpilka327/banr9836/

是否真的鉻錯誤嗎?

編輯 我不認爲論證是正確的。 HTML解析器應該與JavaScript解析器無關。 首先,任何內容都應該被解析爲JavaScript,而不是HTML。這絕對是HTML解析器的錯誤實現。

對於你的好奇心:

var c= {"Content":"<SCRIPT></SCRIPT>"} 
 
console.log(c.Content);

主要生產中的jsfiddle的SAM錯誤...這絕對是很好形成。

再一次可以爭辯說SCRIPT標籤不能出現在外部SCRIPT標籤內,然而無論在SCRIPT標籤中包含什麼,都應該將其解析爲不是HTML的腳本,特別是如果在常規字符串文字中轉義。

這樣的論證只提倡糟糕的實現。

很明顯,在使用序列化爲json的自定義內容並保存在SCRIPT標記中時,該行爲會產生錯誤。

只是好奇你刪除了菲利克斯的標籤,爲什麼?

+0

對象文字與JSON不一樣。這裏沒有JSON。 –

+0

那麼這個對象字面值是JSON兼容的。但是,確切地說,是的,這是對象字面。沒有區別。 – OSP

+1

「首先,無論是否包含在''中,都應該被解析爲JavaScript,而不是HTML。這是HTML解析器的絕對錯誤實現。」 - 不是。在HTML裏面的JavaScript是**。您需要解析HTML(這裏是開始標記,這裏是一個文本節點,這裏是結束標記,現在將文本節點傳遞給JS解析器以作爲JS處理),或者您需要識別開始標記和然後切換到解析JS,直到到達無法標記「JS的結尾」的JS的末尾,因此這是不可能的,因此HTML + JS不會被設計爲像那樣被解析。 – Quentin

回答

2

不,這不是Chrome的bug。 HTML解析器不知道JavaScript的任何內容,它會在它發現的</script>的第一個匹配項上關閉<script>標籤。如果這是JavaScript程序的中間,那麼最終會生成一個無效的程序。

任何具有特殊含義但不應解釋爲特殊含義的字符序列都需要被轉義或拆分。

另請參見Why split the <script> tag when writing it with document.write()?

+0

嗯,我不認爲你的解釋是正確的。 首先,不管是否包含在應該被解析爲JavaScript,而不是HTML。這絕對是錯誤的實現。 其次,此代碼產生相同的錯誤: – OSP

+0

*「應該被解析爲JavaScript,而不是HTML」*它不是解析JavaScript的HTML解析器作業。爲了獲得JavaScript代碼,必須先解析HTML文檔。這是HTML解析器的工作。然後它將'