首頁 > web前端 > html教學 > 知名瀏覽器對DOCTYPE模式的選擇機制_HTML/Xhtml_網頁製作

知名瀏覽器對DOCTYPE模式的選擇機制_HTML/Xhtml_網頁製作

WBOY
發布: 2016-05-16 16:42:40
原創
1376 人瀏覽過

文件範圍

本文包含的模式轉換(mode switching)適用於Firefox和其他基於Gecko的瀏覽器,Safari、Chrome和其他基於Webkit的瀏覽器,Opera、 Konqueror、Mac版Internet Explorer、Windows版Internet Explorer和內嵌版IE的瀏覽器。避免提及瀏覽器引擎的名字,取而代之的是使用該引擎最知名瀏覽器的名字。

本文著重介紹模式的選擇機制,而不是記錄每個模式的確切行為。

模式

以下是各種不同的模式:

內容類型為text/html的模式

text/html內容的模式選擇取決於doctype嗅探(doctype sniffing,本文後面有討論)。在IE8中,模式也取決於其他因素。然而在IE8的預設情況下,那些不在微軟提供黑名單上的非區域網路(non- intranet)網站的模式取決於文件​​類型。

再怎麼強調每個瀏覽器中模式精確行為的不同也是不過分的,即使本文中進行了統一的討論。

怪癖模式(Quirks Mode)
怪癖模式中,為了避免「破壞」那些根據在20世紀90年代末流行的實踐創作的頁面,瀏覽器違反了現代的Web格式規範。不同的瀏覽器實現了不同的怪癖行為。在 Internet Explorer6、7和8中,怪癖模式有效地凍結在IE5.5 。其他瀏覽器中,怪癖模式是對準標準模式的少量偏移。
如果正在創作新網頁,你應該符合相關的規範(特別是CSS2.1)且使用標準模式。
標準模式(Standards Mode)
標準模式中,瀏覽器嘗試給予符合標準的文件在規範上的正確處理達到在指定瀏覽器中的程度。
不同的瀏覽器遵循不同的階段,所以標準模式也不是單一目標。
HTML5把這種模式叫做「非怪癖模式(no quirks mode)」
準標準模式(Almost Standards Mode)
irefox、Safari、Chrome、Opera(從7.5開始)和IE8也有個叫「準標準模式」的模式,它按照傳統的做法來實現表格單元格的垂直尺寸而不是嚴格的遵照CSS2規範。 Mac IE5、Windows IE6和7、Opera7.5先前版本和Konqueror無需準標準模式,因為它們至少沒有在各自的標準模式下嚴格遵循CSS2規範來實現表格單元垂直尺寸。實際上,它們的標準模式更接近Mozilla的準標準模式而不是Mozilla的標準模式。
HTML5把這種模式叫著「受限怪癖模式(limited quirks mode)」。
IE7模式
IE8有個模式主要是凍結了IE7標準模式的副本。其他瀏覽器沒有像這樣的模式,且該模式也未被HTML5指定。

內容類型為application/xhtml xml的模式(XML模式)

Firefox、Safari、Chrome和Opera中,application/xhtml xml HTTP內容類型(不是meta元素也不是doctype!)會觸發XML模式。在XML模式中,瀏覽器嘗試給予XML文件在規範上的正確處理達到在製定瀏覽器中的程度。

IE6、7和8不支援application/xhtml xml,Mac IE5也是如此。

基於WebKit的Nokia S60 瀏覽器中,application/xhtml xml HTTP內容類型不能觸發XML模式,因為在移動的圍牆花園(mobile walled gardens)中關注點是對不規範內容的兼容性。 (舊式的「行動瀏覽器」無法使用真正的XML解析器,因為不規範內容已被標記為XML。)

由於沒有充分測試Konqueror,我無法確切地說出在這個瀏覽器中會發生什麼。

非Web模式(Non-Web Modes)

某些引擎擁有的模式與Web內容無關。為了完整性,它們只是在這裡被提到。 Opera有WML2.0模式。 Leopard上的WebKit有個舊式Dashboard widgets的特定模式。

影響

以下是這些模式的主要影響:

版面

text/html的模式主要是影響CSS佈局。例如,表格不繼承樣式是個怪癖。在某些瀏覽器的怪癖模式下,盒子模型(box model)變成IE5.5的盒子模型。本文檔沒有列舉出所有的佈局怪癖。

準標準模式(有這種模式的瀏覽器中)中,僅包含圖片的表格單元格的高和標準模式中不同。

XML模式中,選擇器有不同的區分大小寫行為。此外,用於HTML body元素的特有規則不能套用在那些沒有實作最新CSS2.1改變的較舊版本的瀏覽器。

解析

也有一些怪癖影響HTML和CSS的解析且會導致符合標準的網頁被錯誤解析。怪癖佈局決定了這些怪癖是否開啟。無論如何,了解怪癖模式和標準模式在CSS佈局和解析(非HTML解析)上的主要異同是非常重要的。

有些人錯誤地把標準模式稱為“嚴格解析模式(strict parsing mode)”,其讓人誤解了瀏覽器強制執行HTML語法規則和用瀏覽器評估標記的正確性。情況並非如此。即使標準模式佈局生效時,瀏覽器仍會做標籤雜燴湯(tag soup,http://en.wikipedia.org/wiki/Tag_soup)修正工作。 (在2000年Netscape6發布前,Mozilla的確有用於強制執行HTML語法規則的解析模式。這些模式和現有的Web內容不相容而被遺棄。)

另一個常見的誤解是關於XHTML解析的。通常認為用XHTML doctype得到不同的解析。其實並非如此,內容類型是text/html的XHTML文件所用解析器和HTML文件的是同一個。目前瀏覽器在意的是文檔類型為text/html的XHTML僅是「撒麵包丁的標籤雜燴湯(tag soup with croutons)」(到處是額外的斜線)。

僅當使用XML文件類型的文件(例如:application/xhtml xml或xmapplication/)會觸發XML模式來解析,這時的解析器完全不同於HTML解析器。

腳本

雖然怪癖模式主要是關於CSS的,但也有一些是關於腳本的。例如,Firefox的怪癖模式中,HTML id 屬性像在IE一樣建立了全域腳本作用域的物件參考。 IE8中關於腳本的影響比其他瀏覽器更值得關注。

XML模式中,某些DOM API的行為徹底不同,因為XML的DOM API行為被定義時不相容HTML的行為。

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也會觸發標準模式,且10歲大的HTML4.01有效定義是穩定的。請確保在Firefox、Safari、Chrome、 Opera9或Opera10中測試影像對齊。在Internet Explorer中測試影像對齊是不足夠的,無論如何請確保在IE8中也進行了測試。
要使用標準模式,但仍要驗證不建議標記或在表格佈局中使用切片影像且不想修復它們。
它會觸發準標準模式(和老掉牙的Mozilla中的完全標準模式full Standards mode)。請注意,如果以後移植到HTML5上,基於利用表格實現的切片影像的佈局可能會被破壞(且完整標準模式也是如此)。
故意要用怪癖模式
沒有doctype。
請不要這樣做。故意為怪癖模式所做的設計將會困擾你,在將來你的同事或繼任者甚至沒有人關心Windows IE6(Netscape4.x和IE5已經沒有人關心了)。為怪癖模式設計是個壞主意。相信我。
如果你想依舊支援Windows IE6,對它做一個特別的hack使用條件註解比讓其他瀏覽器退步到怪癖模式好。

我不推薦任何的XHTML doctype,因為XHTML被用作text/html被認為是有害的。無論如何,如果你選擇使用XHTML doctype,請注意XML宣告會使IE6(但不是IE7!)觸發怪癖模式。

application/xhtml xml

application/xhtml xml的簡單指南是絕不使用doctype。該方式下的網頁不是「嚴格一致」的XHMTL1.0,但這並不重要。 (見後面的附錄

IE8 併發症

A List Apart 曾介紹 ,IE8除doctype外會使用基於meta元素的模式轉換作為模式選擇的因素之一。 (見Ian HicksonDavid BaronDavid Baron againRobert O'CallahanMaciej StawiakIE8有4種模式:IE5.5怪癖模式、IE7標準模式、IE8 準標準模式 和IE8標準模式。模式的選擇取決於來自幾個方面的資料:doctype、meta元素、HTTP頭、微軟的定期下載資料、區域網域、使用者所做設定、區域網路管理員所做設定、父框架的模式(如果有)和網址列相容視圖按鈕被使用者觸發。 (對於嵌入該引擎的其他應用,模式也取決於嵌入的應用。)

幸運的是如果出現下列情況,IE8大體上會像其他瀏覽器一樣使用doctype嗅探:

作者沒有設定X-UA-Compatible HTTP頭
  • 作者沒有設定X-UA-Compatible meta標籤
  • 微軟沒有在黑名單中放置該網站的網域名稱
  • 區域網路管理員沒有把該站點放置到
  • 黑名單
  • 使用者沒有按下相容視圖按鈕(Compatibility View button) (或以其他方式加入某個特定的使用者黑名單)
  • 該站點不在區域網路中
  • 使用者沒有選擇在IE7中顯示所有網站
  • 頁面沒有透過frame嵌入到相容模式的頁面中
  • 上述除兩個關於X-UA-Compatible的情況外,IE8像IE7一樣執行doctype嗅探。 IE7仿真( IE7 emulation)叫做相容視圖。

在 X-UA-Compatible 情況下,IE8的行為和其他瀏覽器完全不同。想看本頁的附錄PDFPNG格式的流程圖。

不幸的是,沒有X-UA-Compatible的HTTP頭或​​meta標籤,即使使用了合適的doctype,IE8讓用戶無意間使頁面從IE8的標準模式降到IE7模式,這是一種仿真的IE7標準模式。更糟的是,區域網路管理員也可以這麼做。微軟也可以把你所使用的所有網域到列入黑名單。

為了對付這些影響,doctype是不夠的,你需要X-UA-Compatible HTTP頭和meta標籤。

下面的簡單指南是針對已經有doctype在其他瀏覽器觸發標準模式或準標準模式的新的text/html文件如何選擇X-UA-Compatible HTTP頭或​​meta標籤的:

你的網域沒有在微軟的黑名單上,你更關注是沒有瀏覽器專屬的令人討厭的東西而不是確保用戶無法回退去呈現IE7的行為。
你不需要包含X-UA-Compatible HTTP頭或​​meta標籤。
你的網域在微軟的黑名單中,由於你網域中的其他作者破壞了網站或許導致用戶對整個網域啟用了相容視圖,你擔心Google或Digg用frame嵌入你的網站或你想確保使用者無法使用相容視圖
首先,在你的頁麵包含後面的meta元素(它在HTML5中是非法的) (在任何腳本元素前),或設定後面的HTTP頭:X-UA-Compatible: IE=Edge
你的站點在IE7中工作但在IE8中破壞
首先,在你的頁麵包含後面的meta元素(它在HTML5中是非法的) (在任何腳本元素前),或設定後面的HTTP頭: X-UA-Compatible: IE=EmulateIE7,然後修復你的網站不依賴非標準的IE7行為和遷移到IE=Edge。

相關連結

補遺:對XML的實現者和規範作者的懇求

請不要把doctype嗅聞帶到XML。

doctype嗅聞是用簽雜燴湯似的方法解決一個標籤雜燴湯問題。 doctype嗅探是在HTML4和CSS2規範發布後設計的一種試探方法,它從文件中區分出過時文件以符合其作者可能期望的行為。

偶爾有人建議在XML上使用doctype嗅探來調度不同的處理、識別正在使用的詞彙表或活化特性。這是個壞主意。調度和詞彙表辨識應該是基於名字空間的,而特性活化應該是基於明確的處理指令或元素。

良構(well-formedness)的整個想法是介紹允許XML的無DTD解析,並推廣無doctype文件。在正式情況下,兩個XML文件有相同的規範形式且應用不同地處理它們(且不同之處並非因為沒有選擇處理外部實體),這個應用或許被破壞了。在實務情況下,如果兩個XML文檔導致同樣的內容被報告(qnames忽略)給SAX2內容處理器且應用不同地處理文檔,這個應用或者被破壞了。考慮到作為Web作者無法相信每個人都會使用解決額外實體的XMLprocessor來解析其頁面(即使一些瀏覽器看起來這樣做,因為它們會映射一定公共的標識符到一個有刪節的定義實體的DTD),插入doctype到XML中用於Web是毫無意義的且通常會導致貨運崇拜(cargo cultish)習慣。 (您仍然使用W3C驗證器的DTD覆蓋功能來對一個DTD進行驗證,雖然W3C驗證器會說結果只是暫時有效。或更好的是,你可以用放寬NG驗證,它不會污染模式引用的文檔。

此外,當低階的規範定義兩個相等的東西時,高層次的規範不應該嘗試給它們不同的意義。請考慮。如果刪除公共識別符,依舊指定了相同的DTD,因此doctype 表示和前面的doctype一樣。應該不同地嗅探它們麼?可以進一步理論。假設複製給example.com一個叫做foobar.dtd的DTD:。這該如何嗅探?應該是同一個意思。甚至整個DTD可以貼在文件中。

換句話說,如果有#include “foo.h”,你不應該給名字foo.h綁定任何black magic,因為它應該允許複製foo.h的內容到文檔中或複製foo.h到bar.h中且表示#include “bar.h”。

我不擔心HTML和SGML構造相同的參數的原因是Web瀏覽器不會使用真正的SGML解析器去解析HTML,所以我認為偽裝成SGML進行處理是沒有用的。無論如何,如果你還不相信,請看W. Eliot Kimber關於此事的文章 comp.text.sgml

附錄:text/html中一些doctype的處理方式

下表中,怪癖模式、標準模式和準標準分別表示為Q、S和A。當瀏覽器僅有兩種模式時,如果表格單元格的行高和Mozilla的標準模式表現一致時,標準模式標記為“S”,如果表格單元格的行高和Mozilla的準標準模式表現一致時,則標記為“A”。

請注意使用XML內容模型提供服務的XHTML在XML模式下渲染。

本表的目的並不是說表中所有的doctype都是新頁面的合理選擇。本表的目的是為了展示我的推薦是依據什麼樣的數據。

下列的簡寫符號是用於列標題:

NS6
Mozilla 0.6…0.9.4 和Netscape 6.0…6.2.3
Old Moz
Mozilla 0.15 到Mozilla 0.15
Moz & Safari & Opera 10 & HTML5
Moz & Safari & Opera 10 & HTML5
Mozilla 1.0.1, Mozilla 1.1 beta和更高版本, Firefox 到Netscape 7, Safari 0.9 到Safari 4.0 beta, Opera 10, Chrome Konqueror 3.5, HTML5指定的行為
Opera 9.0
Opera 9.0…9.20
IE 8 & Opera 9.5
Compible模式所涵蓋的預設IE8(此情況下「A」表示IE8準標準模式)、 Opera 7.5…8.54 和9.5…9.6
IE 7 & Opera 7.10
IE7、相容模式且無X-UA-Compatible所涵蓋的IE8(這種情況下「A」意義IE7模式)和Opera 7.10…7.23
IE 6 & Opera 7.0
Windows IE 6 和Opera 7.0… 7.03
Mac IE 5
Mac IE 5.0…5.2.3
Konq 3.2
Konqueror 3.2.23.3. .1; 我尚未確定)
DoctypeNS6 Old Moz Moz & Safari & Opera10 & HTML5Opera9.0IE8 & Opera9.5 IE7 & Opera7.10 IE6 & Opera7.0 Mac IE5 Konq3.2 QQQQQQQQQQQQQQQQQQSSSSSAAAASSSSSAAQASSSSSAAAA
None
">
/font>HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
">
/font>HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
">
/font>HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
">
br />HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/html4 /strict.dtd">
">
br />HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
S S S S S
">HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
">br />HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
">br />HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR / html4/loose.dtd">
S S
">br />HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR / 1999/REC-html401-19991224/loose.dtd">

 

S
">br />HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR / html4/loose.dtd">
"> S S S S S
"> S S S S S
">br />html PUBLIC "-//W3C//DTD XHTML 1.0 Strict //EN" "http://www.w3.org/TR/xhtml1/ DTD /xhtml1-strict.dtd"> S S S S S
">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> S S
"> S S S S S
"> S S S S S
">版本=“1.0”編碼=“UTF-8”?>-//W3C//DTD XHTML 1.0 嚴格//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
S S S S S
">版本=“1.0”編碼=“UTF-8”?>-//W3C//DTD XHTML 1.0 Transitional //EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

S S
">HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN"> S S
">br />HTML PUBLIC "ISO/IEC 15445:2000//DTD 超文本標記
語言//EN">
S S S S
">HTML PUBLIC "ISO/IEC 15445:1999//DTD HTML//EN"> S S S
">br />HTML PUBLIC "ISO/IEC 15445:1999//DTD 超文本標記
語言//EN">
S S S S S
S S S S  

歷史記錄

Moziila的doctype嗅探程式碼在2000年10月、2001年9月和2002年6月有大幅的修改。本文檔所描述的Mozilla(和 Netscape 6.x)建立的狀態可以自2000.10.19起在ftp.mozilla.org上看到。本文檔未涉及Mozilla M18(和Netscape 6.0 PR3)中的doctype嗅探的工作方式。 Safari的doctype嗅探程式碼自第一個公開的測試版起也有大幅的修改。本文檔不包括比版本V73也叫0.9更早的行為。

Konqueror3.5之前的doctype嗅探程式碼似乎來自於Safari的很早的一個版本。 Konqueror現在和Safari匹配,其doctype嗅探代碼來自Mozilla。

從表中可見,Opera的doctype嗅探正由規律的從類似IE向類似Mozilla轉變,雖然Opera9.5和9.6在倒退的路上。同時,Opera怪癖模式的佈局行為已從仿效IE6的怪癖模式轉換為Mozilla的怪癖模式。

附錄:IE8的模式選擇

開始:進入「X-UA-Compatible meta?」
X-UA-Compatible meta?
IE=7:使用IE7標準
IE=7:使用IE7標準
IE=7:使用IE7標準
IE=7:使用IE7標準
IE=7:使用IE7標準
IE=7:使用IE7標準
IE=EmulateIE7: 進入「怪癖或無doctype?(相容模式)」
IE=IE8 或IE=IE7 或IE=a 或IE=EmulateIE8 或沒有或先出現script:進入」X-UA- Compatible HTTP頭?」
IE=8 或IE=Edge 或IE=99 或IE=9.9:進入「準標準模式?」
IE=5:使用怪癖模式(IE5. 5)
X-UA-Compatible HTTP頭?
IE=7:使用IE7標準模式
IE=EmulateIE7:進入「怪癖或無doctype?(相容模式)」
IE=IE8 或IE=IE7 或IE=a 或IE=EmulateIE8 或沒有:進入「顯示所有站點…預先設定? IE=99 或IE=9.9:進入「準標準模式?」
IE=5:使用怪癖模式(IE5.5)
怪癖模式或無doctype?(相容模式)
是:使用怪癖模式(IE5.5)
否:使用IE7標準模式
顯示所有站點…預先設定?
是:進入「怪癖模式或無doctype?(相容模式)」
否:進入「顯示區域網站點…預先設定?」
顯示區域網站…預設定?
是:進入「網站位於區域網路?」
否:進入「網域名稱在微軟維護的名單上?」
網域在微軟維護的名單上?
是:進入「怪癖模式或無doctype?(相容模式)」
否:進入「被相容模式頁用Frame嵌入?」
被相容模式頁面用Frame嵌入?
是:進入「怪癖模式或無doctype?(相容模式)」
否:進入「按下了相容模式按鈕?」
按下了相容模式按鈕?
是:進入「怪癖模式或無doctype?(相容模式)」
否:進入「怪癖模式或無doctype?(IE8)」

怪癖模式或無doctype?(IE8) 是:進入「使用怪癖模式(IE5.5)」 否:進入「準標準模式?」

準標準模式?

是:使用IE8準標準模式

否:使用IE8標準模式 這些步驟都可以透過PDF和PNG格式的流程圖看到。 鳴謝 感謝Simon Pieters、Simon Pieters和Anne van Kesteren幫助我改正了各種Opera版本的模式表和他們的評論。感謝Simon Pieters製作了另一份IE8的流程圖。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板