天天看點

通過 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嗅探來排程不同的處理、識别正在使用的詞彙表或激活特性。這是個壞主意。排程和詞彙表識别應該是基于名字空間的,而特性激活應該是基于明确的處理指令或元素。

繼續閱讀