通過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)文件型別宣告包含(被空白分開)“字串,根元素(“html”)的通用識別符號, “PUBLIC”字串,處於引號中的DTD公共識別符號,同一DTD的可能系統識別符號(URL)和字元 “>”。文件型別宣告位於文件的根元素開始標籤之前。
選擇Doctype
text/html
下面是建立新的text/html文件時如何選擇doctype的簡單指南:
- 標準模式,最前沿的驗證
如果想驗證諸如和ARIA這樣的新特性,那麼這樣做是對的。注意,HTML5的有效定義依舊在變化中,請確保在Firefox、Safari、Chrome、Opera9或Opera10中測試影像對齊。在Internet Explorer中測試影像對齊是不足夠的,無論如何請確保在IE8中也進行了測試。
- 標準模式,更穩定的驗證目標
這個doctype也會觸發標準模式,但是由於對新功能不瞭解,這些傳統的驗證不是很精確,為避免你的組織需要進行對驗證目標的守舊的策略。你還是應該把使用修改為你們組織的設計策略。
另外,如果你使用表格顯示切片影像,你最好使用標準模式。
它會觸發近乎標準模式。請注意,如果以後移植到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嗅探來排程不同的處理、識別正在使用的詞彙表或啟用特性。這是個壞主意。排程和詞彙表識別應該是基於名字空間的,而特性啟用應該是基於明確的處理指令或元素。
相關文章
- 谷歌瀏覽器翻譯在哪裡開啟 谷歌瀏覽器的線上翻譯在哪裡設定谷歌瀏覽器
- 谷歌瀏覽器怎麼翻譯英文網頁 chrome瀏覽器自帶翻譯功能怎麼用谷歌瀏覽器網頁Chrome
- [譯] 通過安全瀏覽保護 WebViewWebView
- 翻譯 | 擺脫瀏覽器限制的JavaScript瀏覽器JavaScript
- 2. 瀏覽器控制瀏覽器
- 通過瀏覽器執行cmd命令、啟動steam瀏覽器
- [譯]從內部瞭解現代瀏覽器(2)瀏覽器
- edge瀏覽器翻譯功能在哪 edge網頁翻譯成中文方法介紹瀏覽器網頁
- 通過 WebAssembly 在瀏覽器執行 PHPWeb瀏覽器PHP
- [翻譯]通訊模式(Communication Patterns)模式
- 手機瀏覽器通過Scheme跳轉APP,相容各種手機瀏覽器瀏覽器SchemeAPP
- [翻譯]一個新式的基於文字的瀏覽器 Browsh瀏覽器
- 使用Urllib2製作有道翻譯器
- Laravel 配合 puppeteer 實現操作瀏覽器(以谷歌翻譯為例,免費翻譯無限量文字)Laravel瀏覽器谷歌
- python用selenium開啟瀏覽器後瀏覽器關閉---解決辦法Python瀏覽器
- docker官方文件翻譯2Docker
- rabbitmq 官方文件翻譯-2MQ
- 設定Windows主機的瀏覽器為wls2的預設瀏覽器Windows瀏覽器
- 怎麼用谷歌瀏覽器開啟jupyter谷歌瀏覽器
- [譯]瀏覽器工作原理探究瀏覽器
- 重學瀏覽器(2)-程式間的互動瀏覽器
- Win10系統怎麼啟用Microsoft Edge瀏覽器閱讀模式Win10ROS瀏覽器模式
- 使用chrome瀏覽器驅動自動開啟瀏覽器Chrome瀏覽器
- Electron教程翻譯2:安裝
- 學php之翻譯wordpress(2)PHP
- !DOCTYPE —— HTML文件模式HTML模式
- 如何使用 Python 通過 Tor 瀏覽器發出請求Python瀏覽器
- shellinabox 可以用瀏覽器開啟的 SSH瀏覽器
- 2┃音視訊直播系統之瀏覽器中通過 WebRTC 拍照片加濾鏡並儲存瀏覽器Web
- [譯] 瀏覽器中 CSS 支援指南瀏覽器CSS
- 現代瀏覽器探祕(part2):導航瀏覽器
- 360瀏覽器極速模式怎麼開 360瀏覽器如何調整極速模式瀏覽器模式
- 瀏覽器開啟md文件瀏覽器
- win10瀏覽器flash無法啟用怎麼辦_win10瀏覽器flash無法啟用如何出來Win10瀏覽器
- 【譯】瀏覽器如何工作:在現代web瀏覽器場景的之下瀏覽器Web
- 瀏覽器跨標籤通訊瀏覽器
- Win10系統如何開啟Chrome瀏覽器黑暗模式Win10Chrome瀏覽器模式
- 文件翻譯器怎麼用?如何翻譯Word文件?
- 如何通過瀏覽器 JavaScript API 訪問伺服器資料庫瀏覽器JavaScriptAPI伺服器資料庫