Javascript 由 IE8 User-Agent 更新想到的

來源:互聯網
上載者:User

更改的部分資訊如下:

IE8 on Windows Vista (Compatibility View)Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)IE8 on Windows VistaMozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)

除了 IE8 因 Compatibility View 功能造成單瀏覽器“原生”多個 User-agent 外,還有個情況也變得非常的有趣,就是幾乎每個瀏覽器都將自己渲染引擎的標識加入到了 User-agent 中(Gecko、Webkit、Trident)。

User-agent 資訊常被用作檢測瀏覽器類型和版本的最佳途徑(YUI、jQuery),而上述的改動是否意味著以後類似的檢測指令碼會變得更加的複雜?回答這個問題之前,讓我們看下 Mootools 如何檢測瀏覽器資訊

var Browser = {Engine: {name: 'unknown', version: 0},Features: {xpath: !!(document.evaluate),     // 是否支援 XPathair: !!(window.runtime),        // 是否支援 Air 擴充query: !!(document.querySelector) // 是否支援 CSS 選取器},Engines: {// 判斷 Operapresto: function() {return (!window.opera) ?false : ((arguments.callee.caller) ?960 : ((document.getElementsByClassName) ? 950 : 925));},// 判斷 IE,根據 ActiveX 和 特有的 XMLHttpRequest 對象trident: function() {return (!window.ActiveXObject) ?false : ((window.XMLHttpRequest) ? 5 : 4);},// Webkit 核心的瀏覽器,如 Safari 和 Chromewebkit: function() {return (navigator.taintEnabled) ?false : ((Browser.Features.xpath) ?((Browser.Features.query) ? 525 : 420) : 419);},// Mozilla Gecko 核心瀏覽器,如 Firefoxgecko: function() {return (document.getBoxObjectFor == undefined) ?false : ((document.getElementsByClassName) ? 19 : 18);}}};Browser.detect = function() {for (var engine in this.Engines){var version = this.Engines[engine]();// 如果具有特定的瀏覽器對象if (version){this.Engine = {name: engine, version: version};this.Engine[engine] = this.Engine[engine + version] = true;break;}}return {name: engine, version: version};};Browser.detect();

上述代碼讓人感到耳目一新,它是根據瀏覽器功能而非 User-agent 判斷瀏覽器類型。仔細考慮一下,User-agent 資訊可以被偽造,同時瀏覽器廠商日後也會更改 User-agent 資訊,所以此種情況下根據功能判斷瀏覽器類型會可靠得多。

延伸下此策略,比如我們會編寫這樣的代碼:

if (ie) {// ie only} else {// other browsers}

這樣因瀏覽器差異而編寫的“硬代碼”,往往會造成維護兩套實際相同功能的代碼,並造成邏輯上的混亂。何不先拋開瀏覽器安全色的問題,然後再判斷相應的對象是否被瀏覽器支援。

OK,有關編程思想的問題就不繼續了…

-- Split --

PS,目前判斷是否是 IE8 可這樣編寫

var isIE8 = !!window.XDomainRequest;
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.