如何使用javascript检测IE10?

正如许多已经在其他问题(也在jQuery文档中)中发布的那样,旧的jQuery.browser.version已被弃用,仅适用于jquery1.3。

您是否知道另一种检测它的简单方法,我可以在之前的代码中包含:

 function handleInfoDivPopupVisibility(dynamicEleId, staticEleId){ var parentContainer = $('headerSummaryContainer'); var dynamicEle = $(dynamicEleId); var staticEle = $(staticEleId); if(isIE() && parentContainer){ if (jQuery.browser.version != 10) { // I need to find a way to detect if it's IE10 here. parentContainer.style.overflow = 'visible'; } } dynamicEle ? dynamicEle.style.display = '' : ''; if(dynamicEle && staticEle) gui_positionBelow(dynamicEle, staticEle); } 

在你说这个或这个重复的问题之前,我想强调我不想使用css hacks。 有没有办法像以前一样简单地检测它?

 if (jQuery.browser.version != 10) {... 

一般来说,检查浏览器版本是个坏主意,检查浏览器function被认为是更好的做法。 但如果你确定你在做什么:

 function getIEVersion(){ var agent = navigator.userAgent; var reg = /MSIE\s?(\d+)(?:\.(\d+))?/i; var matches = agent.match(reg); if (matches != null) { return { major: matches[1], minor: matches[2] }; } return { major: "-1", minor: "-1" }; } var ie_version = getIEVersion(); var is_ie10 = ie_version.major == 10; 

我们在生产中有以下代码,因此它可以正常运行并经过充分测试。

是的,我们确实需要检测IE10,而不仅仅是IE10中存在的特定function,而不是早期版本中的function。

Internet Explorer具有条件编译function( http://www.javascriptkit.com/javatutors/conditionalcompile.shtml )。 你可以用这个:

 var isIE10 = false; /*@cc_on if (/^10/.test(@_jscript_version)) { isIE10 = true; } @*/ alert(isIE10); 

演示: http //jsfiddle.net/X3Rvz/1/

您可以在所有JavaScript代码之前添加此代码,然后仅引用isIE10

条件编译不会在非IE中运行,因此isIE10仍然是false 。 并且@_jscript_version只会在IE 10中以10开头。

IE 10中不支持条件注释,并且可以欺骗用户代理字符串。

由于缩小通常会删除注释,因此您可以使用evalFunction以类似的方式查找:

 var isIE10 = false; if (Function('/*@cc_on return /^10/.test(@_jscript_version) @*/')()) { isIE10 = true; } 

演示: http //jsfiddle.net/wauGa/2/


更新:

为了避免缩小注释,同时结合检测任何版本,您可以使用以下内容:

 var IE = (function () { "use strict"; var ret, isTheBrowser, actualVersion, jscriptMap, jscriptVersion; isTheBrowser = false; jscriptMap = { "5.5": "5.5", "5.6": "6", "5.7": "7", "5.8": "8", "9": "9", "10": "10" }; jscriptVersion = new Function("/*@cc_on return @_jscript_version; @*/")(); if (jscriptVersion !== undefined) { isTheBrowser = true; actualVersion = jscriptMap[jscriptVersion]; } ret = { isTheBrowser: isTheBrowser, actualVersion: actualVersion }; return ret; }()); 

并访问IE.isTheBrowserIE.actualVersion (从JScript版本的内部值转换)等属性。

jQuery.browser.version仍然有效,但你必须包含jquery-migrate插件。

http://api.jquery.com/jQuery.browser/ https://github.com/jquery/jquery-migrate/#readme

IE10用户代理字符串说

但是,如果您的站点仍在使用用户代理嗅探,则将“MSIE”令牌增加到“10.0”尤其值得注意。 为什么? 因为它为令牌的字符串值添加了一个额外的数字。 大多数网站都会毫不费力地处理这个问题,但是有些网站会错误地处理额外的数字,导致他们将IE10识别为IE1。

为了帮助说明,这里是一个正则表达式,它只捕获“MSIE”标记值的第一个数字:

 // INCORRECT: will report IE10 version in capture 1 as "1" var matchIE = /MSIE\s(\d)/; 

这里有一个捕获“MSIE”令牌的全部值:

 // Correct: will report IE10 version in capture 1 as "10.0" var matchIE = /MSIE\s([\d.]+)/ 

这是一个检测IE 10的单行解决方案

 var IE10 = navigator.userAgent.toString().toLowerCase().indexOf("trident/6")>-1; 

有关其他版本和浏览器的更多信息,请参阅此浏览器检测链接

我发现自己有一个问题(框架集与图例的边界半径)与IE 9到11(没有检查IE 12)
MSIE在IE 11中不是长用户代理,appName是Mozilla,但是三叉戟在那里我设法提取三叉戟版本#并检测它

 if(navigator.appVersion.indexOf('Trident/')>-1){// Begin stupid IE crap var IE=navigator.appVersion; IE=IE.slice(IE.indexOf('Trident/')+8); IE=IE.slice(0,IE.indexOf(';')); IE=Number(IE); if(IE>=5&&IE<=7) // IE 9 through IE 11 document.body.className='ie'; }