Internet Explorer - 在没有库的JavaScript中检查IE小于9的最佳方法

internet explorer - Best way to check for IE less than 9 in JavaScript without library

本文关键字:IE 检查 小于 方法 最佳 JavaScript Internet Explorer      更新时间:2023-09-26

在不使用jQuery或任何附加库的情况下,在JavaScript中检测IE浏览器和版本小于9的最快,最短(最佳(方法是什么?

Javascript

var ie = (function(){
    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');
    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );
    return v > 4 ? v : undef;
}());

然后,您可以执行以下操作:

ie < 9

作者:James Panolsey: http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments

的价值:

    if(  document.addEventListener  ){
        alert("you got IE9 or greater");
    }

这成功地针对 IE 9+,因为除 IE 之外的每个主要浏览器都很早就支持addEventListener方法。(Chrome、Firefox、Opera 和 Safari(MDN 参考。它目前在IE9中受支持,我们可以预期它将继续在这里得到支持。

使用条件注释,您可以创建一个脚本块,该脚本块仅在小于 9 的 IE 中执行。

<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]--> 

当然,您可以在此块之前加上一个声明 var is_ie_lt9=false 的通用块,这将覆盖小于 9 的 IE。(在这种情况下,您需要删除var声明,因为它是重复的(。

编辑:这是一个不依赖于内联脚本块(可以从外部文件运行(但不使用用户代理嗅探的版本:

通过@cowboy:

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}

bah 到有条件的评论! 一路有条件代码!! (愚蠢的IE(

<script type="text/javascript">
/*@cc_on
   var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>

不过说真的,只是把它扔在那里,以防它更适合你......它们是一回事,这可以只是在.js文件中而不是内联HTML

注意:这里的jscript_version检查为"9"完全是巧合。 将其设置为 8、7 等不会选中"是 IE8",您需要查找这些浏览器的 jscript 版本。

以下是

对James Padolsey解决方案的改进:

1(它不会污染内存(例如,James的代码片段在检测IE11时会创建7个未删除的文档片段(.
2(它更快,因为它在生成标记之前检查文档模式值。3(它更清晰,特别是对于初级JavaScript程序员。

要点链接:https://gist.github.com/julianshapiro/9098609

/*
 - Behavior: For IE8+, we detect the documentMode value provided by Microsoft.
 - Behavior: For <IE8, we inject conditional comments until we detect a match.
 - Results: In IE, the version is returned. In other browsers, false is returned.
 - Tip: To check for a range of IE versions, use if (!IE || IE < MAX_VERSION)...
*/
var IE = (function() { 
    if (document.documentMode) {
        return document.documentMode;
    } else {
        for (var i = 7; i > 0; i--) {
            var div = document.createElement("div");
            div.innerHTML = "<!--[if IE " + i + "]><span></span><![endif]-->";
            if (div.getElementsByTagName("span").length) {
                return i;
            }
        }
    }
    return undefined;
})();
var ie = !-[1,]; // true if IE less than 9

IE5,6,7,8支持此黑客。它在ie9 +中是固定的(因此它适合这个问题的要求(。此黑客适用于所有IE兼容模式。

工作原理:即引擎将带有空元素的数组(如这个 [,1](视为具有两个元素的数组,而不是其他浏览器认为只有一个元素。因此,当我们用 + 运算符将此数组转换为数字时,我们执行类似操作:(ie中的",1"/其他中的"1"(*1,我们在 ie 中得到 NaN,在其他中得到 1。比我们将其转换为布尔值并用 ! 反转值。简单。顺便说一下,我们可以使用没有 !符号,但值将被反转。

这是目前最短的黑客攻击。我是作者;)

我决定改用对象检测。

读完这篇文章后:http://www.quirksmode.org/js/support.html而这个:http://diveintohtml5.ep.io/detect.html#canvas

我会使用类似的东西

if(!!document.createElement('canvas').getContext) alert('what is needed, supported');

此链接包含有关检测 Internet Explorer 版本的相关信息:

http://tanalin.com/en/articles/ie-version-js/

例:

if (document.all && !document.addEventListener) {
    alert('IE8 or older.');
}
您可以使用

正则表达式以快速而肮脏的方式执行此操作,并.match()

if (navigator.userAgent.match(/MSIE's(?!9.0)/)) {
    // ie less than version 9
}

如果我是你,我会使用条件编译或特征检测。
这是另一种选择:

<!--[if lt IE 9]><!-->
<script>
    var LTEIE8 = true;
</script>
<!--<![endif]-->

我喜欢迈克刘易斯的回答,但代码没有通过jslint,我无法理解时髦的while循环。我的用例是,如果小于或等于IE8,则放置浏览器不支持的消息。

这是一个基于Mike Lewis的jslint免费版本:

/*jslint browser: true */
/*global jQuery */
(function () {
    "use strict";
    var browserNotSupported = (function () {
        var div = document.createElement('DIV');
        // http://msdn.microsoft.com/en-us/library/ms537512(v=vs.85).aspx
        div.innerHTML = '<!--[if lte IE 8]><I></I><![endif]-->';
        return div.getElementsByTagName('I').length > 0;
    }());
    if (browserNotSupported) {
        jQuery("html").addClass("browserNotSupported").data("browserNotSupported", browserNotSupported);
    }
}());

它需要在 JavaScript 中完成吗?

如果没有,则可以使用特定于IE的条件注释语法:

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->
if (+(/MSIE's('d+)/.exec(navigator.userAgent)||0)[1] < 9) {
    // IE8 or less
}
  • 提取IE版本:/MSIE's('d+)/.exec(navigator.userAgent)
  • 如果是非IE浏览器,这将返回null因此在这种情况下||0会将该null切换到0
  • [1]将获得IE的主要版本,如果不是IE浏览器,则undefined
  • 前导+会将其转换为数字,undefined将转换为NaN
  • NaN与数字进行比较将始终返回false

你们都试图使这些简单的事情过于复杂。只需使用简单明了的 JScript 条件注释。它是最快的,因为它向非 IE 浏览器添加了零代码以进行检测,并且它的兼容性可以追溯到支持 HTML 条件注释之前的 IE 版本。总之

var IE_version=(-1/*@cc_on,@_jscript_version@*/);

当心缩小器:大多数(如果不是全部(会将特殊条件注释误认为常规注释,并将其删除

基本上,上面的代码将 IE_version 的值设置为您正在使用的 IE 版本,或者 -1 f 您不使用 IE。现场演示:

var IE_version=(-1/*@cc_on,@_jscript_version@*/);
if (IE_version!==-1){
    document.write("<h1>You are using Internet Explorer " + IE_version + "</h1>");
} else {
    document.write("<h1>You are not using a version of Internet Explorer less than 11</h1>");
}