在不使用jQuery或任何附加库的情况下,检测IE和JavaScript版本低于9的浏览器的最快,最短(最佳)方法是什么?
Answers:
Java脚本
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
while
语法吗?还是某种骇客?
物有所值:
if( document.addEventListener ){
alert("you got IE9 or greater");
}
这成功针对IE 9+,因为该addEventListener
方法在IE以外的所有主要浏览器中都得到了很早的支持。(Chrome,Firefox,Opera和Safari)MDN参考。IE9当前支持它,我们可以期望它继续得到支持。
var ltIE9 = !document.addEventListener;
document.addEventListener
。IE条件注释在这方面是防故障的。
if( !document.attachEvent){ // IE8+ }
使用条件注释,您可以创建仅在IE 9以下版本中执行的脚本块。
<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]-->
当然,您可以在此块之前加一个声明为的通用块,该通用块var is_ie_lt9=false
将在IE小于9时被覆盖(在这种情况下,您将希望删除该var
声明,因为它会重复)。
编辑:这是一个不依赖内联脚本块(可以从外部文件运行)但不使用用户代理嗅探的版本:
通过@cowboy:
with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
h有条件评论!始终有条件的代码!!!(傻IE)
<script type="text/javascript">
/*@cc_on
var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>
认真地说,只是把它扔在那里,以防它更适合您……他们是同一回事,这可以只是在.js文件中,而不是内联HTML
注意:这里的jscript_version检查为“ 9”完全是巧合。将其设置为8、7等不会检查“是IE8”,您需要为那些浏览器查找jscript版本。
IE_LT_9 == false
IE9和true
IE8。我现在使用的是Mac,并且这里没有PC,因此无法测试,但是我从编写的代码中撤出了我知道的代码。如果由于某种原因它不起作用,alert(@_jscript_version)
请查看您得到的内容并从那里进行调整。
以下是对James Padolsey解决方案的改进:
1)它不会污染内存(例如,James的代码片段在检测IE11时会创建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;
})();
var ie = !-[1,]; // true if IE less than 9
ie5,6,7,8支持此hack。它在ie9 +中是固定的(因此适合此问题的要求)。该技巧适用于所有IE兼容模式。
工作原理:即引擎将具有空元素(例如[,1])的数组视为具有两个元素的数组,相反,其他浏览器认为只有一个元素。因此,当我们使用+运算符将此数组转换为数字时,我们将执行以下操作:(',1'在ie中/其他在'1')* 1,在Na中获得NaN,在其他情况下获得1。然后我们将其转换为布尔值并使用!反转值。简单。顺便说一句,我们可以使用较短的版本而无需!符号,但值将相反。
到目前为止,这是最短的hack。我是作者;)
我决定改为使用对象检测。
阅读以下内容后: 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/cn/articles/ie-version-js/
例:
if (document.all && !document.addEventListener) {
alert('IE8 or older.');
}
我喜欢Mike Lewis的回答,但是代码没有通过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);
}
}());
你们都试图使这样简单的事情变得过于复杂。只需使用简单的JScript条件注释即可。它是最快的,因为它向非IE浏览器添加了零代码以进行检测,并且具有支持HTML条件注释之前的IE版本的兼容性。简而言之,
var IE_version=(-1/*@cc_on,@_jscript_version@*/);
当心缩小符:大多数(如果不是全部)会将特殊条件注释误认为是常规注释,然后将其删除
基本上,然后上面的代码将IE_version的值设置为您正在使用的IE版本,或者将-1f设置为不使用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>");
}