最近支持公司的一個內部業務管理系統,系統是基於jQuery來實現;用了2年的MVVM框架的我轉向這個完全使用jQuery框架來開發的系統,真是相當不爽(相信用過MVVM框架的跟我是相同的感受);更為憋屈的是,到了這個年代,IE的親爹微軟都放棄支持IE6-10了,系統盡然還只支持使用IE瀏覽器(運營電腦安裝都是IE8瀏覽器,所以大部分只管IE8),其他高級瀏覽器不被支持(當然這是由於系統使用了基於IE的一些插件導致)。
但是話又說回來,但是在支持系統的開發過程中,經常看到X-UA-Compatible的meta配置值,甚是不解,這也暴漏了自己在有關瀏覽器兼容性視圖方面知識的缺陷。為此通過查閱資料對IE文檔兼容性模式有了一定的理解,雖然這些東西會逐漸的退出歷史舞台。
1、瀏覽器兼容性簡介
歷史由來
在W3C標准推出之前的瀏覽器大戰時代,微軟的IE瀏覽器系列和網景瀏覽器之間各自為政,他們的頁面是兩套完全不同的實現方式,網頁要兼容必須要實現兩套代碼;對於開發者來說,這是比較痛苦的,也不利於標准化和普及。為此W3C制定了一套標准規范,雖然初期這兩個公司未必執行這些標准,畢竟人家有大量的市場占有率,一個小小的機構組織能奈我何;但是為日后的標准化制定了一套規范。在W3C規范推出后,之前各自為政開發的頁面在標准模式下就不能使用了;由於存在大量規范之前開發的頁面還在服務中,為此,為了兼容之前老頁面的使用,這才有了瀏覽器兼容性;
三種模式
瀏覽器器兼容性最早出現在IE6瀏覽器,是為了兼容之前頁面的展示。它有IE6標准模式和IE5.5的怪異模式兩種模式,其中詭異模式為了兼容之前老頁面的。那么瀏覽器一般有幾種模式呢?根據這篇文章《Activating Browser Modes with Doctype》介紹,准確的說是以下三種模式:
- 標准模式(standards mode):按照W3C制定的標准來執行對應的HTML、CSS和JS行為。
- 准標准模式(almost standards mode):大部分們是標准模式,只有一小部分表現為怪異行為。
- 怪異模式(quicks mode): 按照網景4和IE5.5的行為來展現
瀏覽器雖有上述三種模式,但是需要注意的是我們談及最多的是標准模式和詭異模式,根據Activating Browser Modes with Doctype的介紹,不同的doctype可能會導致不同的模式。還需補充一點:標准模式並不完全標准。因瀏覽器廠商實現標准的階段不同,所以各個瀏覽器的標准模式之間也有很大的不同。
瀏覽器區分標准和怪異模式,那么如何區分當前文檔處於何種模式呢?
使用IE為document提供的compatMode屬性來判斷,具體判斷如下表所示。后續其他的標准瀏覽器也實現了該屬性用於檢測文檔處於何種模式;
compatMode值 | 文檔模式 |
CSS1Compat | 標准模式 |
BackCompat | 怪異模式 |
后來從IE8開始又為document提供了documentMode屬性;它不像compatMode那樣概括性的得出非此即彼的結果,而是可以具體檢測當前IE瀏覽器版本下網頁具體的文檔呈現模式。如IE8下有3種模式:5(怪異模式)、7(IE標准模式)、8(IE8標准模式)。但是其他標准瀏覽器並沒有實現該屬性。
另外,如果文檔中沒有包含DOCTYPE或者無法識別的DOCTYPE(除了下面講到的X-UA-Compatible配置,其配置值為IE5-11會忽略DOCTYPE),那么瀏覽器就會進入怪異模式。
2、瀏覽器模式與文檔模式
這兩個概念是與瀏覽器兼容性相關的,在兼容性視圖下或者在開發者工具欄下,你將看到瀏覽器兼容性和文檔模式。例如下圖是本機IE9瀏覽器的開發者工具下的瀏覽器模式和文檔模式
- 瀏覽器模式(Browser Mode): 用於切換IE針對當前文檔的默認文檔模式、對瀏覽器不同版本的條件注釋的解析、決定請求頭的userAgent的值。
- 文檔模式(document mode): 決定文檔的排版引擎和js引擎。
在開發者工具中切換不同瀏覽器模式,其對應的默認文檔模式為當前瀏覽器模式的值;如IE7-9的瀏覽器模式對應的文檔模式分別為IE7-9標准;
另外,注意IE8-9的兼容性模式對應的默認文檔模式是IE7標准。例如下面代碼在瀏覽器模式對應的兼容性模式下均為IE7文檔模式:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>test</title> 6 </head> 7 <body> 8 <!--[if IE 6 ]> 9 <span style="color:red">this is ie6</span><br /><br /> 10 <![endif]--> 11 <!--[if IE 7 ]> 12 <span style="color:red">this is ie7</span><br /><br /> 13 <![endif]--> 14 <!--[if IE 8 ]> 15 <span style="color:red">this is ie8</span><br /><br /> 16 <![endif]--> 17 <!--[if IE 9 ]> 18 <span style="color:red">this is ie9</span><br /><br /> 19 <![endif]--> 20 </body> 21 </html>
不同文檔模式,其documentMode值是不同的,根據上面一節講到的,通過documentMode能具體的獲取當前瀏覽器的文檔呈現模式;如IE9下的文檔模式有:
文檔模式 | documentMode |
怪異模式 | 5 |
IE7標准 | 7 |
IE8標准 | 8 |
IE9標准 | 9 |
可以看到,IE8+后的瀏覽器版本的兼容性模式中,不會有IE6的文檔模式。
3、IE瀏覽器的文檔兼容模式
上面介紹了IE瀏覽器模式的切換會改變網頁的默認文檔模式,但是是否可以指定網頁的文檔模式呢,這是當然可以的,這篇文章《定義文檔兼容性,讓IE按指定的版本解析我們的頁面》講解的很透徹;具體地是需要用到IE8才開始支持的X-UA-Compatible的meta配置;為該X-UA-Compatible配置不同的值,網頁就會按照指定的文檔模式來渲染模式以及對應的JS引擎來執行,也就是說開啟了IE瀏覽器的兼容模式。例如為網頁指定以IE8的標准模式來呈現的配置如下:
<meta http-equiv="X-UA-Compatible" content="IE=8">
除了上述的X-UA-Compatible配置值,還有其他的配置值,具體的如下:
X-UA-Compatible值 | 說明 |
---|---|
IE=5 | 讓瀏覽器使用Quirks mode來顯示,實際上是使用Internet Explorer 7 的 Quirks 模式來顯示內容,這個模式和IE5非常相似。 |
IE=edge | 這個設置是讓IE使用當前的最高版本進行文檔的解析,官方文檔指明,edge模式僅適用在測試環境,不建議在生產環境中使用 |
IE=7 | 使用標准IE7來處理 |
IE=EmulateIE7 | 模擬IE7來處理,遵循 <!DOCTYPE> 指令,如果文檔有當前有一個合法的<!DOCTYPE>,就使用IE7模式,否者使用Quirks模式(Internet Explorer 5 Quirks),對於大部分網站來說,這是首選的兼容性模式 |
IE=8 | 標准IE8 |
IE=EmulateIE8 | 模擬IE8,遵循 <!DOCTYPE> 指令,參照IE=EmulateIE7說明 |
IE=9 | 標准IE9 |
IE=EmulateIE9 | 模擬IE9,遵循 <!DOCTYPE> 指令,參照IE=EmulateIE7說明 |
chrome=1 | 強制使用Chrome,需要IE下Chrome插件支持 |
IE=EmulateIE10 | 模擬IE10,遵循 <!DOCTYPE> 指令,參照IE=EmulateIE7說明 |
IE=10 | 標准IE10 |
需要注意的是,若設置的值為表格其他值,那么IE的解釋是會嘗試將數值轉化為最接近的瀏覽器版本。
<meta http-equiv="X-UA-Compatible" content="IE=7.5" > <!-- IE7 mode -->
在客戶端可以通過設置meta的X-UA-Compatible值的來變更瀏覽器的文檔模式,服務器端同樣可以變更瀏覽器的文檔模式。服務可以在響應頭response header中設置X-UA-Comptible的值為響應的值來變更當前網頁的文檔模式。
服務器以這種方式,同樣可以指定網頁的文檔模式;個人感覺這個種方式相對來說比較靈活,可以根據不同的瀏覽器來設置對應的文檔模式。
另外,IE開發者工具和IE瀏覽器的兼容性視圖的列表配置等等均可以改變瀏覽器的文檔模式。
4、決定IE瀏覽器文檔模式的優先級
話說回來,既然有上一節提到的4種方式可以變更瀏覽器的文檔模式,那么他們的優先級孰高孰低呢?這個可以參考上面提到的文章《關於瀏覽器模式和文本模式的困惑》里面的兩幅圖來說明。
IE9下的文檔模式的優先級的決定順序如下圖:
IE8的文檔模式優先級如下圖:
從上面IE8、9的文檔模式圖中可以看出:
- IE8、9瀏覽器的兼容性模式默認均是使用IE7仿真模式作為文檔模式的;
- 兼容性視圖配置的信息同樣默認是IE7仿真模式作為文檔模式的。
所以在兼容老頁面時,IE7仿真視圖是首選的兼容性方式。
參考:
3、定義文檔兼容性