瀏覽器控件兼容性問題

   最近在做網站運維的時候,碰到一個網站安全控件無法顯示的問題,和同事測試了好幾天終於明白了一些原理,今天隨便做下記錄,也分享給其他人,以便參考。


首先是瀏覽器內核的幾大家族介紹:


Trident

Trident:IE瀏覽器使用的內核,該內核程序在1997年的IE4中首次被採用,是微軟在Mosaic代碼的基礎之上修改而來的,並沿用到目前的IE8。Trident實際上是一款開放的內核,其接口內核設計的相當成熟,因此纔有許多采用IE內核而非IE的瀏覽器涌現(如 Maxthon、The World 、TT、GreenBrowser、AvantBrowser等)。此外,爲了方便也有很多人直接簡稱其爲IE內核(當然也不排除有部分人是因爲不知道內核名稱而只好如此說)。

  由於IE本身的“壟斷性”(雖然名義上IE並非壟斷,但實際上,特別是從Windows 95年代一直到XP初期,就市場佔有率來說IE的確藉助Windows的東風處於“壟斷”的地位)而使得Trident內核的長期一家獨大,微軟很長時間都並沒有更新Trident內核,這導致了兩個後果——一是Trident內核曾經幾乎與W3C標準脫節(2005年),二是Trident內核的大量 Bug等安全性問題沒有得到及時解決,然後加上一些致力於開源的開發者和一些學者們公開自己認爲IE瀏覽器不安全的觀點,也有很多用戶轉向了其他瀏覽器,Firefox和Opera就是這個時候興起的。非Trident內核瀏覽器的市場佔有率大幅提高也致使許多網頁開發人員開始注意網頁標準和非IE瀏覽器的瀏覽效果問題。

Gecko

Gecko:Netscape6開始採用的內核,後來的Mozilla FireFox也採用了該內核,Gecko的特點是代碼完全公開,因此,其可開發程度很高,全世界的程序員都可以爲其編寫代碼,增加功能。因爲這是個開源內核,因此受到許多人的青睞,Gecko內核的瀏覽器也很多,這也是Geckos內核雖然年輕但市場佔有率能夠迅速提高的重要原因。

  事實上,Gecko引擎的由來跟IE不無關係,前面說過IE沒有使用W3C的標準,這導致了微軟內部一些開發人員的不滿;他們與當時已經停止更新了的 Netscape的一些員工一起創辦了Mozilla,以當時的Mosaic內核爲基礎重新編寫內核,於是開發出了Geckos。不過事實上,Gecko 內核的瀏覽器仍然還是Firefox用戶最多,所以有時也會被稱爲Firefox內核。此外Gecko也是一個跨平臺內核,可以在Windows、 BSD、Linux和Mac OS X中使用。

Presto

  Presto: 目前Opera採用的內核,該內核在2003年的Opera7中首次被使用,該款引擎的特點就是渲染速度的優化達到了極致,也是目前公認網頁瀏覽速度最快的瀏覽器內核,然而代價是犧牲了網頁的兼容性。

  實際上這是一個動態內核,與前面幾個內核的最大的區別就在腳本處理上,Presto有着天生的優勢,頁面的全部或者部分都能夠在迴應腳本事件時等情況下被重新解析。此外該內核在執行Javascrīpt的時候有着最快的速度,根據在同等條件下的測試,Presto內核執行同等Javascrīpt所需的時間僅有Trident和Gecko內核的約1/3(Trident內核最慢,不過兩者相差沒有多大)。那次測試的時候因爲Apple機的硬件條件和普通PC機不同所以沒有測試WebCore內核。只可惜Presto是商業引擎,使用Presto的除開Opera以外,只剩下NDSBrowser、Wii Internet Channle、Nokia 770網絡瀏覽器等,這很大程度上限制了Presto的發展。

Webkit

Webkit:

蘋果公司自己的內核,也是蘋果的Safari瀏覽器使用的內核。 Webkit引擎包含WebCore排版引擎及JavaScriptCore解析引擎,均是從KDE的KHTML及KJS引擎衍生而來,它們都是自由軟件,在GPL條約下授權,同時支持BSD系統的開發。所以Webkit也是自由軟件,同時開放源代碼。在安全方面不受IE、Firefox的制約,所以Safari瀏覽器在國內還是很安全的。

  限於Mac OS X的使用不廣泛和Safari瀏覽器曾經只是Mac OS X的專屬瀏覽器,這個內核本身應該說市場範圍並不大;但似乎根據最新的瀏覽器調查表明,該瀏覽器的市場甚至已經超過了Opera的Presto了——當然這一方面得益於蘋果轉到x86架構之後的人氣暴漲,另外也是因爲Safari 3終於推出了Windows版的緣故吧。Mac下還有OmniWeb、Shiira等人氣很高的瀏覽器。

  google的chrome也使用webkit作爲內核。

  WebKit 內核在手機上的應用也十分廣泛,例如 Google 的手機 Gphone、 Apple 的 iPhone, Nokia’s Series 60 browser 等所使用的 Browser 內核引擎,都是基於 WebKit。

WebCore

  WebCore是蘋果公司開發的排版引擎,它是在另外一個排版引擎“KHTML”的基礎上而來的。蘋果電腦於2002年採納了KHTML,作爲開發Safari瀏覽器之用,併發布所修改的最新及過去版本源代碼。後來發表了開放源代碼的WebCore及WebKit引擎,它們均是KHTML的衍生產品。使用WebCore的主要有Safari,此外還有OmniWeb、Shiira、Swift等。Safari現支持Windows,但效果不如iOS上的。

KHTML

KHTML:

  KHTML,是HTML網頁排版引擎之一,由KDE所開發。

  KDE系統自KDE2版起,在檔案及網頁瀏覽器使用了KHTML引擎。該引擎以C++編程語言所寫,並以LGPL授權,支援大多數網頁瀏覽標準。由於微軟的Internet Explorer的佔有率相當高,不少以FrontPage製作的網頁均包含只有IE才能讀取的非標準語法,爲了使KHTML引擎可呈現的網頁達到最多,部分IE專屬的語法也一併支援。

  KHTML擁有速度快捷的優點,但對錯誤語法的容忍度則比Mozilla產品所使用的Gecko引擎小。

  蘋果電腦於2002年採納了KHTML,作爲開發Safari瀏覽器之用,併發布所修改的最新及過去版本源代碼。後來發表了開放源代碼的WebCore及WebKit引擎,它們均是KHTML的衍生產品,在開發網站列出引擎改變內容,並會傳回至KDE計劃。由於兩個衍生產品各走不同路線,使兩者源代碼偏離,在與KDE交換更新會出現困難。其中一個原因,是蘋果在對外公開源代碼之前,以一年時間編修他們的KHTML。另外,蘋果傳送更新至KDE計劃的方式,多是一口氣把大量改動一起傳送,KDE在整理資料也出現一定的困難,及後蘋果表示會以CVS格式來傳送。再者,蘋果所作出的改動包括Mac OS X系統獨有的事物,如Objective-C、KWQ等,在Linux及KHTML是沒有的。但KDE方面仍透過這些改動,爲KHTML加入新功能及加快其排版速度。




第二個問題:多種內核

什麼是多種內核,就是指瀏覽器支持多種內核,現在瀏覽器都比較智能了,同時包含多種內核,用戶可以在網站上方便切換。因爲我們使用360瀏覽器,也是因爲360最初是基於IE的緣故吧,準確的說因爲我們的控件只支持IE內核。 設置多內核切換的說明地址 :http://jingyan.baidu.com/album/fcb5aff7908846edaa4a7128.html


問題又來了,多內核切換到IE,網站是可以正常顯示了,但用戶就算會自己切換,這樣不方便啊,其實360已經做的挺好了,360有個功能是用戶如果打開網頁切換到IE兼容模式,360會記錄,下次打開該網頁會自動切換到用戶使用過的模式下,保證正常顯示, 本着精益求精的精神繼續研究發現360居然支持用戶網站內核自定義,這也是一個創舉,必將成爲潮流,用戶在也不煩惱瀏覽器兼容問題了,好了下來說說這個用戶自定義如何實現。

wKioL1NOGrTiZ1KPAAB6MrZEMnY864.jpg

<html>

  <head>

     <meta  name="renderer"content="webkit|ie-comp|ie-stand">

  </head>

</html>

content的取值爲webkitie-compie-stand之一,區分大小寫,分別代表用Webkit內核,IE兼容內核,IE標準內核。

例如,網站必須在IE6瀏覽器內核下渲染,可以在head裏添加以下代碼:

各渲染內核的技術細節


內核

Webkit

IE兼容

IE標準

文檔模式

Chrome 21

IE6 / IE7

IE9 \ IE10 \ IE11

(取決於用戶的IE)

HTML5支持

YES

NO

YES

ActiveX控件支持

NO

YES

YES



這個內核渲染細節也非常重要,因爲你網站如何設置了兼容模式,那意味着你支持IE6/IE7.但是同時你就不支持HTML5,這給後邊的網站開發帶來問題。


各內核UA示例

Webkit內核UA示例

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1

IE兼容內核UA示例

User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)

IE標準內核UA示例

User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)



最後一些測試方式:alert(navigator.userAgent);  查詢IE內核 ,瀏覽器直接輸入,其它內核暫不支持此方式獲取信息 。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章