在不使用jQuery或任何附加库的情况下,在JavaScript中检测浏览器IE和版本低于9的最快,最短(最佳)方法是什么?
答案 0 :(得分:118)
<强>的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
答案 1 :(得分:99)
它的价值:
if( document.addEventListener ){
alert("you got IE9 or greater");
}
这成功地针对IE 9+,因为addEventListener
方法很早就支持每个主要浏览器,但是IE。 (Chrome,Firefox,Opera和Safari)MDN Reference。它目前在IE9中得到支持,我们可以预期它将继续得到支持。
答案 2 :(得分:27)
使用条件注释,您可以创建一个仅在小于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}
答案 3 :(得分:10)
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版本。
答案 4 :(得分:9)
以下是对James Padolsey解决方案的改进:
1)它不会污染内存(例如,在检测到IE11时,James的代码段会创建7个未删除的文档片段。)
2)它更快,因为它在生成标记之前检查documentMode值。
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;
})();
答案 5 :(得分:8)
var ie = !-[1,]; // true if IE less than 9
ie5,6,7,8支持此hack。它固定在ie9 +(所以它适合这个问题的要求)。此hack适用于所有IE兼容模式。
工作原理:即引擎处理带有空元素的数组(如此[,1])为具有两个元素的数组,而其他浏览器则认为只有一个元素。因此,当我们使用+运算符将此数组转换为数字时,我们会执行以下操作:(',1'在ie /'1'在其他情况下)* 1,我们在ie中获得NaN,在其他中获得1。然后用!将它转换为布尔值和反向值。简单。顺便说一句,我们可以使用更短的版本!标志,但价值将被逆转。
这是目前最短的黑客攻击。我是作者;)
答案 6 :(得分:6)
我决定改用对象检测。
看完之后: http://www.quirksmode.org/js/support.html 还有这个: http://diveintohtml5.ep.io/detect.html#canvas
我会使用像
这样的东西if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
答案 7 :(得分:5)
此链接包含有关检测Internet Explorer版本的相关信息:
http://tanalin.com/en/articles/ie-version-js/
示例:
if (document.all && !document.addEventListener) {
alert('IE8 or older.');
}
答案 8 :(得分:4)
你可以使用正则表达式和.match()
:
if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
// ie less than version 9
}
答案 9 :(得分:4)
如果我是你,我会使用conditional compilation或特征检测 这是另一种选择:
<!--[if lt IE 9]><!-->
<script>
var LTEIE8 = true;
</script>
<!--<![endif]-->
答案 10 :(得分:2)
是否需要在JavaScript中完成?
如果没有,那么您可以使用特定于IE的条件注释语法:
<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->
答案 11 :(得分:2)
我喜欢Mike Lewis的回答,但代码没有通过jslint,我无法理解那个时髦的循环。我的用例是,如果小于或等于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);
}
}());
答案 12 :(得分:1)
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
// IE8 or less
}
/MSIE\s(\d+)/.exec(navigator.userAgent)
null
,因此||0
会将null
切换为0
[1]
将获得主要版本的IE或undefined
如果它不是IE浏览器+
会将其转换为数字,undefined
将转换为NaN
NaN
与数字进行比较将始终返回false
答案 13 :(得分:0)
你们都在努力使这些简单的事情过于复杂化。只需使用简单明了的JScript条件注释即可。它是最快的,因为它为非IE浏览器添加零代码以进行检测,并且在支持HTML条件注释之前,它具有可追溯到IE版本的兼容性。简而言之,
var IE_version=(-1/*@cc_on,@_jscript_version@*/);
小心缩小词:大多数(如果不是全部)会将特殊条件评论误认为是常规评论,并将其删除
基本上,上面的代码将IE_version的值设置为您正在使用的IE版本,或者-1如果您没有使用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>");
}