2015-05-14 66 views
2

在下面的代碼片段中,<按照預期在Firefox 37.0.2中呈現,我在許多其他現代瀏覽器中也看到了相同的效果。這個textarea規範是否有效的HTML5?理想情況下它不應該是&amplt;由轉義「<」瀏覽器如何處理HTML中的「<」?

<html> 
<textarea> 
Hello World < 
</textarea> 
</html> 

怎樣的HTML解析器一個標記區分打開和「<」?大多數瀏覽器都會通過猜測自動處理錯誤,這是這種情況嗎?

我對此感興趣的原因是因爲當我們在Web Apps中使用所見即所得的編輯器時,我們主要是從編輯器源代碼保存HTML。當我們爲前端進行模板化時,這種行爲使得它不是強制HTML後端的東西。它在沒有HTML引用的情況下工作,但它可能會導致非期望的效果,如TinyMCE編輯器的3.5.8版本中至少有凍結/無限循環。

+5

這是不正確的HTML,不,因爲[驗證器](http://validator.w3.org/#validate_by_input)會告訴你。至於瀏覽器如何處理它,這很容易通過嘗試找出 - 這不會是一個規則。你的具體情況是什麼,你爲什麼問這個? –

+0

我做過了,它在Firefox 37.0.2中的工作如上所述。但它有效嗎?我問的原因是我們遇到了TinyMCE編輯器的問題。事實證明,這可以使開發人員避免使用適當的HTML引用來保存編輯器中保存的內容。 – Nishant

+1

http://validator.w3.org/#validate_by_input –

回答

4

這確實只是猜測。在HTML中使用文字<的正確方法是使用&lt;(並且&gt;用於>)。

也就是說,textarea是有點特定的,因爲它永遠不能包含任何其他的HTML元素 - 所以解析器可以肯定你的意思是文字<而不是起始標籤。當然,它打破了爲</textarea> :)

從HTML 4規格:

第5.3.2節:

希望把

作者在文中的 「<」 字應該用 「<」 (ASCII十進制60),以避免可能與標籤開始混淆(開始標籤打開定界符)。同樣,作者應該在文本中使用「>」(ASCII十進制62)而不是「>」,以避免舊版用戶代理錯誤地將其視爲引用屬性值中出現的標籤末尾(標記關閉分隔符)時出現問題。

所以它不是必要和HTML 4,但它仍然是很好的做法。當然,XHTML和/或HTML 5可能會更嚴格一些。在許多事情中,HTML規範實際上是非常不具體的,這對於確保瀏覽器與(或多或少)微妙的方式是不兼容的有很長的路要走。最好的辦法不是依賴HTML 允許的所有內容,而只限於那些非常明確和具體的內容。原因很簡單 - 兩個瀏覽器可以100%完全符合HTML規範,並且仍然以完全無用的方式處理相同的HTML。

+0

那是對的,我們不應該依賴HTML允許的東西。但很難在開發人員中實現這一點,他們很樂意通過包括你在內的任何方式使其工作.-) – Nishant

2

在實際代碼中很難說沒有洞察力,但常見的HTML解析器在遇到開始標籤時試圖找到結束標籤。

所有與元素不相似的字符都會被打印出來,就好像它們已經被轉義了一樣如果您幸運的話!對於僅允許文本的元素(例如示例中的<textarea>),這當然是正確的。

這是無效的HTML,應該明顯地避免。

2

Mozilla的HTML解析器將忽略任何'小於'尖括號,而不是立即由有效的標記類型繼承。 任何空格字符(空格,製表符,換行符等)都會使括號「不是標記」。 另外textarea中的任何東西都只能是文本。

1

無論有效性如何,HTML5規範都完全定義了精確的分析規則。

當樹構造規則遇到<textarea>標籤,該tokeniser被切換到RCDATA state

在該狀態下,如果tokeniser遇到它切換到RCDATA less-than sign state

在這種狀態下<字符,除非下一個字符是/,它將<簡寫爲<並繼續。否則,表示器切換到RCDATA end tag open state

等等,目的是允許解析器檢測</textarea>標記,但將其他所有內容作爲文本傳遞。

沒有涉及「猜測」,所有現代瀏覽器,包括自IE10以來的IE遵循這些規則。

相關問題