以搜狗高速瀏覽器、360 安全瀏覽器、世界之窗瀏覽器為代表,它們都有兩個渲染模式,一個兼容 IE6、另一個比較現代。但它們大都完全依賴白名單策略,完全無視「X-UA-Compatible "IE=Edge,chrome=1"」這樣明確的要求。

這有技術障礙嗎?還是會帶來什麼麻煩?還是他們覺得這不重要?


你寫的這個X-UA-Compatible的兩個值分別代表如下含義:1、如果是IE的話使用最高版本的引擎渲染,2、如果支持chrome frame,則使用chrome frame渲染

雙核瀏覽器中使用IE內核和webkit內核,只有一個IE版本,所以Edge無效,因為沒有chrome frame,所以第二個值也無效。

你理想的是根據這個標籤來切換內核,但事實的情況是瀏覽器會先選好一個內核,再去渲染頁面。如果一定要達到你想的效果,則需要更改瀏覽器的邏輯,同時會造成一次頁面刷新(使用新內核渲染)。

目前沒有這樣做的原因,可能是不重視引起的吧,覺得沒有什麼必要,技術上應該只是邏輯會稍麻煩一點,多一次判斷和切換內核,不算太難。
國內的雙核模式一般都是這樣的:

- 「兼容模式」:調用系統中所安裝的 IE 內核;

- 「極速模式」:Chromium 定製 (Webkit + V8)網頁中聲明的 X-UA-Compatible 只是在高版本瀏覽器有向前兼容的渲染模式時進行主動選擇,比如可以指定 IE9 按 IE7 模式進行渲染。edge 的話就是始終用最新的 IE 模式渲染。但是雙核瀏覽器不會自己捆綁新版本 IE,所以其使用的用戶系統中的 IE 版本決定了對於安裝了 IE6 的用戶,不可能採取新版本的渲染模式。另外,這個聲明只是讓訪客訪問時使用的瀏覽器選擇兼容版本的,目前尚沒有切換內核的含義。就像你舉的那個例子,瀏覽器能知道你究竟想用哪個內核渲染嗎?顯然只能在你當前的內核模式下選擇合適的兼容版本。雙核瀏覽器本來是個小眾的東西,只是因為國內有那麼大 IE6 份額,有那麼多 IE only 的網站才在國內流行起來。


以產品功能設計的出發點來考慮就很明白了——瀏覽模式切換功能的設計初衷是:讓控制權在用戶控制的客戶端, 而不是開發者控制的服務端。

我想提問者的意思是為什麼國內雙核瀏覽器不自造個類似的聲明,供開發者使用。在IE8出來以前沒看到過 X-UA-Compatible 這種用法,這句聲明是不是微軟自造的?這句申明的解讀是不是涉及到內核技術,國內的外殼瀏覽器無能力自造?

當然有兩點不好的因素:1、造成頁面再次刷新;2、其實是一種hack,對技術發展沒什麼好處。
我必須來吐槽下國內瀏覽器這些無節操的行為。完全無視X-UA-Compatible,連自己文檔裡面寫的規則也不遵守,如360的meta定義:360安全瀏覽器。什麼時候切換到什麼模式上面渲染完全是由自己來定義(這個問題的所有回答都看了,基本都是抄襲別人的回答,自己都沒試過。)。你讓我們這些開發者情何以堪。好吧你至少用標準模式吧,冷不丁的來一個兼容模式,你讓我還支持IE6,7不成?你要有能力自己開發個內核也好,用別人的呢,你就把規則制定好吧。。。============

補充一下:

切換到某個模式可以通過HTTP Server的HEADER來定義,nginx/apache裡面都可以。但是直接在HTML頁面裡面寫的是沒啥用的。

在head標籤中添加一行代碼:

&

&

&

&

&

&

&

content的取值為webkit,ie-comp,ie-stand之一,區分大小寫,分別代表用webkit內核,IE兼容內核,IE標準內核。

若頁面需默認用極速核,增加標籤:&若頁面需默認用ie兼容內核,增加標籤:&若頁面需默認用ie標準內核,增加標籤:&
其實這不僅僅是寫一句聲明就完事的,還需要設置伺服器(IIS、APACHE等),就是在伺服器的某些文件中加入幾句代碼,各種伺服器的設置又各不相同。

咳咳,做過瀏覽器,看到各位都說得很動聽,來打個醬油。

1. 這個compatible 標籤並不是標準,只不過某些瀏覽器在用而已,我寫個瀏覽器為什麼要遵守?憑這一點就來噴國產瀏覽器,噴錯了點。

2. 你知道網路那麼大,但真正會動手寫這個標籤的有多少嗎?技術上可行,事實上幾乎沒有誰會寫這個東西。

IE 最流行的領域是企業應用,兼容性的雷區也在企業應用,而我曾經在一個外包公司待過,企業裡的做法是,讓用戶換個瀏覽器。「IE11?誰讓你裝IE11了?我們這個系統只能用IE8」,這種情況比比皆是,IE的客戶都不鳥這個compatible,網際網路圈也不愛跟IE玩。

3. 國產瀏覽器目前對解析Dom的過程沒有過多參與,基本上就是調用不同核心打開目標網址。

在這個架構上要實現這個功能,就得自己寫網頁解析,解析遇到這個標籤再決定調哪個核心。這會拖慢整個渲染過程,每一次打開網頁都要等幾十幾百毫秒,甚至幾十秒(與網路有關),才能確定用什麼引擎渲染,這對於用戶體驗來說不可接受。

另一個簡單的做法是,打開之後,假如遇到兼容性標籤就換核心,這個過程會讓頁面重新刷新,會傷害用戶體驗,同時多打開一次網頁,也有可能造成行為異常。

最優雅的做法是,在瀏覽的過程中,雙核心能像單核心那樣無縫切換,切換時無需刷新頁面。這個技術基本上沒可能實現,別多想了。
推薦閱讀:
相关文章