通過 Doctype 啟用瀏覽器模式 【已翻譯100%】(2/2)
doctype嗅探(也叫doctype轉換)
現代瀏覽器使用doctype嗅探來決定text/html文檔的引擎模式。這意味著模式的選擇是基於HTML文檔開始的文檔類型聲明(或缺少)。(這不適於使用XML文檔類型的文檔。)
文檔類型聲明(doctype)是SGML的語法偽造,SGML是個舊式的標記框架,HTML5之前的HTML就是依據其定義的。HTML4.01規範中,文檔類型聲明描述的是HTML的版本信息。盡管名字叫“文檔類型聲明”且HTML 4.01規範所描述的是關於“版本信息”,文檔類型聲明並不適用把SGML或XML文檔分類為特定類型的文檔,即使它看起來像是(因為名字)。(更多內容在附錄中)
HTML4.01規範和ISO 8879(SGML)都沒有說關於使用文檔類型聲明作為引擎模式轉換的任何事情。doctype嗅探是基於觀察,在doctype嗅探被設計時,絕大部分的怪癖文檔既沒有文檔類型聲明也沒有引用舊的DTD。HTML5接受這個事實,且定義了text/html中doctype作為唯一的模式轉換。
典型的預HTML5(pre-HTML5)文檔類型聲明包含(被空白分開)“<!DOCTYPE”字符串,根元素(“html”)的通用標識符, “PUBLIC”字符串,處於引號中的DTD公共標識符,同一DTD的可能係統標識符(URL)和字符 “>”。文檔類型聲明位於文檔的根元素開始標簽之前。
選擇Doctype
text/html
下麵是創建新的text/html文檔時如何選擇doctype的簡單指南:
- 標準模式,最前沿的驗證
如果想驗證諸如和ARIA這樣的新特性,那麼這樣做是對的。注意,HTML5的有效定義依舊在變化中,請確保在Firefox、Safari、Chrome、Opera9或Opera10中測試圖像對齊。在Internet Explorer中測試圖像對齊是不足夠的,無論如何請確保在IE8中也進行了測試。
- 標準模式,更穩定的驗證目標
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "https://www.w3.org/TR/html4/strict.dtd">
這個doctype也會觸發標準模式,但是由於對新功能不了解,這些傳統的驗證不是很精確,為避免你的組織需要進行對驗證目標的守舊的策略。你還是應該把使用<!DOCTYPE html>修改為你們組織的設計策略。
另外,如果你使用表格顯示切片圖像,你最好使用標準模式。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
它會觸發近乎標準模式。請注意,如果以後移植到HTML5上,基於利用表格實現的切片圖像的布局可能會被破壞(完整標準模式也如此)。所以最好現在就確認你的設計是兼容標準模式的吧。
- 故意要使用怪癖模式
沒有doctype。
請別這樣做。故意為怪癖模式所做的設計將會困擾你、你的同事以及你未來的繼任者。
如果你仍然想支持IE6,對IE6使用條件注釋做一個特別的hack比應用怪癖模式更好。
我不推薦任何的XHTML doctype,因為XHTML被用作text/html被認為是有害的。如果你選擇使用XHTML doctype,那麼請注意XML聲明會使IE6觸發怪癖模式(IE7不會)。
**
application/xhtml+xml**
對application/xhtml+xml的簡單指南是絕不使用doctype。該方式下的網頁不是“嚴格一致”的XHTML1.0,但這並不重要。(請看後麵的附錄)
IE8/9/10相關的問題
A List Apart上的這篇文章介紹說,IE8除doctype外會使用基於meta元素的模式轉換作為模式選擇的因素之一。(請看Ian Hickson、David Baron、David Baron again、Robert O’Callahan和Maciej Stachowiak的評論。)
IE8有4種模式:IE5.5怪癖模式、IE7標準模式、IE8 近乎標準模式和IE8標準模式。IE9有7種模式:IE5.5怪癖模式、IE7標準模式、IE8 近乎標準模式、IE8標準模式、IE9 近乎標準模式、IE9標準模式和IE9 XML模式。IE10有11種模式:IE5.5怪癖模式、IE7標準模式、IE8 近乎標準模式、IE8標準模式、IE9 近乎標準模式、IE9標準模式、IE9 XML模式、IE10怪癖模式、IE10近乎標準模式、IE10標準模式以及IE10 XML模式。模式的選擇取決於來自幾個方麵的數據:doctype、meta元素、HTTP頭、來自微軟的定期下載數據、局域網域、用戶所做設置、局域網管理員所做設置、父框架的模式(如果有)和地址欄兼容視圖按鈕被用戶觸發。(對於嵌入該引擎的其他應用,模式也取決於嵌入的應用。)
幸運的是如果出現下列情況,IE8/9大體上會像其他瀏覽器一樣使用doctype嗅探,而IE10則會嚴格地使用doctype進行嗅探:
作者沒有設置X-UA-Compatible HTTP頭
作者沒有設置X-UA-Compatible meta標簽
域名沒有被微軟添加到黑名單中
局域網管理員沒有把該站點放置到黑名單上
用戶沒有按下兼容視圖按鈕(或以其他方式添加到某個特定的用戶黑名單中) (Metro IE10 沒有此按鈕, 但是桌麵裏IE10的兼容視圖也會影響到Metro模式下的IE10)
該站點不在局域網域中
用戶沒有選擇以IE7模式顯示所有站點
頁麵沒有通過frame嵌入到兼容模式的頁麵中
上述除兩個關於X-UA-Compatible的情況外,IE8/9像IE7一樣執行doctype嗅探。IE7 emulation就是兼容視圖。
在 X-UA-Compatible 情況下,IE8/9的行為和其他瀏覽器完全不同。想看本頁的附錄或PDF和PNG格式的流程圖。 (與其它瀏覽器圖表的對比:PDF格式) 還有一個從IE5.5到IE9的統一的圖 (包括了 Chrome Frame):PDF格式. (我打算做一個隻包含IE9的這麼一張圖)
不幸的是,沒有 X-UA-Compatible的HTTP頭或meta標簽,即使使用了合適的doctype,IE8/9讓用戶無意間使頁麵從標準模式降到IE7模式,這是一種仿真的IE7標準模式。更糟糕的是,局域網管理員也可以這麼做。微軟也可以把你所用的所有域名到列入黑名單(比如mit.edu)。
為了對付這些影響,doctype是不夠的,你需要X-UA-Compatible HTTP頭和meta標簽。
如果一個新的頁麵已經使用doctype觸發了其它瀏覽器的標準模式,或者近乎標準模式。那麼下麵的內容將指導你如何利用X-UA-Compatible HTTP頭或meta標簽:
你的域名沒有在微軟的黑名單上,而且你更關心網頁裏沒有使用那些令人討厭的瀏覽器專屬內容,而不在乎用戶能不能使用IE7模式顯示你的網頁。
- 你不需要添加X-UA-Compatible HTTP頭或meta標簽。
你的域名在微軟的黑名單中,或者你的域名裏有些網頁有問題而導致用戶可能會對整個域啟用兼容視圖,你擔心Google或Digg用frame嵌入你的站點,或你想確保用戶不能對你的網頁使用兼容視圖
你可以將此meta標簽添加在你的網頁裏所有腳本之前(在HTML5中該標簽是不合法的):;或者為你的頁麵設置此HTTP頭:X-UA-Compatible: IE=Edge。
- 你的網站在IE7下運行良好,在IE8/9下不能正常運行
首先你可以將此meta標簽添加在你的網頁裏所有腳本之前(在HTML5中該標簽是不合法的):;或者為你的頁麵設置此HTTP頭:X-UA-Compatible: IE=EmulateIE7。
然後將你的網站修複為不依賴任何非IE7標準的內容,並遷移到IE=Edge。
- 你的網站在IE8下運行良好,在IE9下不能正常運行
首先你可以將此meta標簽添加在你的網頁裏所有腳本之前(在HTML5中該標簽是不合法的):;或者為你的頁麵設置此HTTP頭:X-UA-Compatible: IE=EmulateIE8。
然後將你的網站修複為不依賴任何非IE8標準的內容,並遷移到IE=Edge。
- 你的網站在IE9下運行良好,在IE10下不能正常運行
首先你可以將此meta標簽添加在你的網頁裏所有腳本之前(在HTML5中該標簽是不合法的):;或者為你的頁麵設置此HTTP頭:X-UA-Compatible: IE=EmulateIE9。
然後將你的網站修複為不依賴任何非IE9標準的內容,並遷移到IE=Edge。
Google Chrome Frame相關的問題
Google Chrome Frame 是一個適用IE6/7/8/9的瀏覽器擴展和插件,它使用IE的網絡連接但是添加了Google Chrome引擎。安裝之後默認還是IE的行為,但是網頁卻可以使用一個X-UA-Compatible的HTTP頭,或者一個meta標簽切換到Chrome引擎上。
在任何安裝了Chrome Frame的瀏覽器環境下設置X-UA-Compatible為chrome=1,都會激活Chrome Frame。如果設置X-UA-Compatible為chrome=IE6,則隻會為IE6激活Chrome Frame。如果設置X-UA-Compatible為chrome=IE7,則隻會為IE6和IE7激活Chrome Frame。如果設置X-UA-Compatible為chrome=IE8,則隻會為IE8及以下的瀏覽器激活Chrome Frame。
這些激活Chrome Frame的指令可以與激活其它IE兼容模式的指令合並起來一起控製IE使用的引擎,使用逗號或分號將這些指令分隔即可,比如:。
網頁一旦激活了Chrome Frame,那麼就像在普通的Chrome裏那樣的選擇這四種模式(標準模式、近乎標準模式、怪癖模式、XML模式)之一了。
但是,還有兩個避免使用Chrome Frame的關鍵因素:
Chrome Frame不支持IE的可訪問性支持。如果激活了Chrome Frame,IE裏的內容區域就不能使用IE的可訪問性支持了,這就意味著屏幕閱讀器以及Window語音識別不能在Chrome Frame下正常運行。
你的網站應該告訴那些將要安裝Chrome Frame的用戶,啟用網站安裝防禦模式,以告訴用戶他們為了使用這個網站需要在本機安裝一個有權限的本地代碼插件。
相關網頁鏈接
Eric Meyer寫的關於Mac IE 5的模式 Use the Right Doctype
Mozilla’s DOCTYPE sniffing 作者:David Baron
CSS Enhancements in Internet Explorer 6 作者:Lance Silver,討論了Windows IE6的模式以及doctype嗅探
The Opera 9 DOCTYPE Switches
Faruk Ateş寫的關於IE8的 IE8 and the X-UA-Compatible situation
補遺:對XML的實現者和規範作者的懇求
請不要把doctype嗅探帶到XML。
doctype嗅探是用標簽雜燴湯似的方法解決一個標簽雜燴湯問題。doctype嗅探是在HTML4和CSS2規範發布後設計的一種試探方法,它從文檔中區分出過時文檔以符合其作者可能期望的行為。
偶爾有人建議在XML上使用doctype嗅探來調度不同的處理、識別正在使用的詞匯表或激活特性。這是個壞主意。調度和詞匯表識別應該是基於名字空間的,而特性激活應該是基於明確的處理指令或元素。
最後更新:2017-07-04 16:32:07