2009-09-10 51 views
5

鑑於使用ASP.NET,JavaScript,CSS等技術的大型遺留項目,我想知道是否將網頁的DOCTYPE從HTML 4.0 Transitional改爲XHTML 1.0 Transitional(或其他方式)任何方式都可能會破壞網頁的JavaScript功能。DOCTYPE的選擇是否會影響JavaScript代碼所見的DOM?

有很多文章和討論關於不同的DOCTYPES如何影響(css)頁面渲染,但我似乎無法找到任何類似的主題打破任何代碼。

我在尋找關於一般應注意事項的文章的鏈接,以便更好地發現現有代碼中的潛在問題,並避免在編寫新代碼時出現問題。

回答

5

改變DOCTYPE是否會打破任何JavaScript函數實際上取決於如何防守這些功能的設計:)

例如,當文檔中怪癖模式document.body(體)呈現成爲所謂的「根元件」;當以標準模式呈現時,該根元素通常是document.documentElement(HTML)。這是一個相當實質的區別。如果確定瀏覽器屏幕大小的腳本始終查詢的clientWidth/clientHeight屬性,它顯然會在怪癖模式下報告不正確的結果(因爲IIRC,document.documentElement.clientWidth/clientHeight將表示HTML元素的維度,而不是屏幕的維度)。

大多數JS庫通常明確指出是否支持quirksmode(我們 - Prototype.js - 例如,不支持quirks模式)。

說到HTML與XHTML,爲了使瀏覽器能夠將文檔呈現爲XHTML,您必須首先使用適當的「Content-type」標頭(即application/xhtml + xml)來提供它。如果您僅將doctype更改爲XHTML版本,但仍然將文檔作爲「text/html」提供,我知道大多數瀏覽器仍將解析(並呈現)爲HTML文檔

請注意,迄今爲止,IE並不瞭解「真正的」XHTML內容,這就是爲什麼要將文檔作爲文本/ html(使用HTML4.01文檔類型)提供推薦的方式(除非IE不支持瀏覽器, 當然)。

至於在「真正的」 XHTML文檔DOM特點,我聽說像document.write有些事情「不工作」,而訪問節點屬性應該總是通過getAttribute/setAttribute進行(而不是通過簡單的屬性訪問器) 。 IIRC,還有一些與innerHTML有關的問題。

在「真實的」XHTML文檔中缺乏有關DOM的信息可能是由於其在一般網絡的文檔/應用程序中不實用(即IE缺乏對它的支持)。

+0

在某些文檔模式中,dom元素不會從Object.prototype繼承,並且因爲它們不能用自定義方法或屬性擴展...... – inf3rno 2013-07-01 05:16:12

1

如果您正在使用DTD:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

那麼你的網站是在IE怪癖模式,在現代瀏覽器幾乎標準模式,因爲XHTML 1.0過渡DTD強制頁面在標準模式下,會出現佈局問題和Javascript中的潛在問題(特別是在IE中),因爲在DOM與標準之間呈現的方式存在一些顯着差異。

但是,如果HTML 4.01 DTD包含系統標識符:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 

它應該已經在標準模式。您可以通過在您的站點中查詢'document.compatMode'進行驗證,如果它處於標準模式中,它將會顯示'CSS1Compat',否則將顯示'BackCompat'。

我假設你將要爲XHTML 1.0 Transitional提供Content-Type的文本/ html。

+0

我驗證了部分/完整文檔類型問題。我對部分/完整的xhtml 1.0 doctype做了類似的測試,它看起來都是 <!DOCTYPE html PUBLIC「 - // W3C // DTD XHTML 1.0 Transitional // EN」「http://www.w3。組織/ TR/XHTML1/DTD/XHTML1-transitional.dtd「> 和 <!DOCTYPE HTML PUBLIC! 」 - // W3C // DTD XHTML 1.0過渡// EN「> 導致瀏覽器渲染頁面在標準符合模式下,即部分的xhtml doctype不會像HTML 4.01那樣強制頁面進入怪異模式。奇怪。 – 2009-09-10 09:09:28

相關問題