IE瀏覽器兼容性模式


     最近支持公司的一個內部業務管理系統,系統是基於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仿真視圖是首選的兼容性方式。

 

參考:

1、深入理解瀏覽器兼容性模式

2、關於瀏覽模式和文本模式的困惑

3、定義文檔兼容性

4、定義文檔兼容性,讓IE按指定的版本解析我們的頁面

5、Activating Browser Modes with Doctype


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM