更改的部分資訊如下:
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;