簡體   English   中英

使用JavaScript檢測Internet Explorer 6的最佳方法是什么?

[英]What is the best way to detect Internet Explorer 6 using JavaScript?

使用JavaScript檢測Internet Explorer 6的最佳方法是什么?

If browser == IE6 {
    alert('hi');
}

條件評論是一個很好的選擇:

<!--[if IE 6]>
<script>
var everythingIsBroken = true;
</script>
<![endif]-->

編輯 :如果您仍然希望在2017年或之后支持IE 6,那么我的心就會向您致敬。 2017年這個問題的答案實在不用擔心IE 6.它不再是受支持的瀏覽器了。 任何可以運行此瀏覽器的操作系統和瀏覽器本身都不再獲得安全更新。 這意味着使用此軟件的用戶很有可能被利用。 對於負擔不起升級的人來說,這是一個大問題。

冒實際回答被問到的問題的風險(並假設提問者有充分的理由專門檢測IE6):

if (/\bMSIE 6/.test(navigator.userAgent) && !window.opera) {
  // yep, browser claims to be IE6
}
  var ua = window.navigator.userAgent;
  var msie = ua.indexOf ( "MSIE " );

  if ( msie > 0 )      // If Internet Explorer, return version number
     return parseInt (ua.substring (msie+5, ua.indexOf (".", msie )));
  else                 // If another browser, return 0
     return 0;

資料來源: http//support.microsoft.com/kb/167820

不要將檢測基於用戶代理。 還有很多其他瀏覽器使用不是IE6的Trident 4引擎(IE6使用的那個)。

答案很簡單: 不檢測瀏覽器 ,檢測引擎 為此,您必須使用所謂的基於特征的檢測


使用基於特征的檢測具有以下優點:

  • 使用與目標相似的渲染引擎檢測所有瀏覽器。
  • 更簡單的代碼分支,以解決渲染引擎的問題。
  • 減少誤報(可以修改UA以作為另一個瀏覽器傳遞,功能不能)。

以下腳本使用瀏覽器功能來檢測引擎。 感謝MooTools制作團隊( http://mootools.net/developers/ )。

注意:下面的代碼段已被修改為在沒有MooTools javascript框架的情況下工作。 如果您確實希望使用MooTools ,則不再需要此代碼,它是分發的一部分。

function $tryCatch(){
    for (var i = 0, l = arguments.length; i < l; i++){
        try {
            return arguments[i]();
        } catch(e){}
    }
    return null;
};

var Browser = {

    Engine: {name: 'unknown', version: 0},

    Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},

    Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},

    Plugins: {},

    Engines: {

        presto: function(){
            return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
        },

        trident: function(){
            return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4);
        },

        webkit: function(){
            return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
        },

        gecko: function(){
            return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18);
        }

    }

};

Browser.Platform[Browser.Platform.name] = true;

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();

Browser.Request = function(){
    return $tryCatch(function(){
        return new XMLHttpRequest();
    }, function(){
        return new ActiveXObject('MSXML2.XMLHTTP');
    }, function(){
        return new ActiveXObject('Microsoft.XMLHTTP');
    });
};

Browser.Features.xhr = !!(Browser.Request());

Browser.Plugins.Flash = (function(){
    var version = ($tryCatch(function(){
        return navigator.plugins['Shockwave Flash'].description;
    }, function(){
        return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
    }) || '0 r0').match(/\d+/g);
    return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0};
})();

function $exec(text){
    if (!text) return text;
    if (window.execScript){
        window.execScript(text);
    } else {
        var script = document.createElement('script');
        script.setAttribute('type', 'text/javascript');
        script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text;
        document.head.appendChild(script);
        document.head.removeChild(script);
    }
    return text;
};

只需包含此JavaScript類,您就可以通過執行以下操作來檢測使用Trident4引擎的IE6和任何其他瀏覽器:

if(Browser.Engine.trident4) {
   alert('IE6 or similar...');
} elseif(Browser.Engine.name == "trident") {
   alert('Internet Explorer Trident Rendering Engine Version ' + Browser.Engine.version);
}

最可靠的方法是使用@apphacker提到的條件注釋。 但是,似乎不那么知名的東西是可以在JavaScript中使用條件注釋:

var div = document.createElement("div");
div.innerHTML = "<!--[if IE 6]><i></i><![endif]-->";
var isIe6 = (div.getElementsByTagName("i").length == 1);

alert("Is IE 6: " + isIe6);

很晚才加入。

除了在apphacker的答案中使用的HTML條件注釋之外 ,Microsoft的JScript實現還為JavaScript提供了條件注釋

<script type="text/javascript">
    var isIE6 = /*@cc_on/*@if(@_jscript_version<=5.6)1@else@*/0/*@end@*/;

    if (isIE6) {
        alert("You're screwed");
    }
</script>

好處是它也可以用在外部JavaScript文件( .js )中。

有關列出由Microsoft主機應用程序實現的JScript版本的表: JavaScript版本信息

使用JavaScript檢測<browser_x>的最佳方法是什么?

不是。

正如Andrew Moore在本文的評論中提到的那樣,您應該使用特征檢測。 這將使您的代碼更加“面向未來”。 如果其他瀏覽器包含或將來不再支持某項功能,那么您的代碼將是安全的。 有很多網站在那里解釋如何處理這個問題。 這個概念是巨大的,涵蓋了很多概念,所以不是寫一篇關於這個的論文/書,這里有一些資源可供使用:

<!--[if (IE 6)|(IE 7)]>
<script>
    alert("Lesser browser detected!");
</script>
<![endif]-->

我不確定您是否有特殊原因要檢測IE 6,但一般來說最好是嘗試檢測瀏覽器的功能而不是檢測瀏覽器。 您可以使用jQuery.support輕松地使用JQuery執行此操作: http//api.jquery.com/jQuery.support/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM