如何使用javascript检测IE10?

12

正如许多人在其他问题(以及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 hack。有没有一种简单的方式来检测它,就像以前那样简单呢?

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

3
你可以使用Modernizr。 - Pointy
5
看起来你只是试图修复一个影响IE<10的CSS问题。为什么不直接使用CSS/HTML结构来解决这个CSS问题,而不是使用JavaScript和/或浏览器嗅探? - Kevin B
4
有什么问题吗?也许我们可以帮你解决这个问题,而不是绕过它。这样,如果它影响了IE11但不影响12,你就不必在各个地方使用一堆if语句(并且你也不必修改你的代码来更新它)。 - Kevin B
2
@Jan Dvorak,针对您在已删除的答案中的评论回复 - http://msdn.microsoft.com/en-us/library/ie/hh801214(v=vs.85).aspx - dsgriffin
2
但是真正的问题是什么?我们还没有看到它。与其使用一些有缺陷的不可靠的用户代理嗅探技术,你可能可以相对容易地解决真正的问题。 - War10ck
显示剩余14条评论
6个回答

17

通常情况下,检查浏览器版本是一个不好的做法,更好的做法是检查浏览器功能。但如果你确信自己在做什么:

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中存在但在早期版本中不存在的某个特定功能。


1
我同意你的观点。这也许是jQuery推荐使用$.support而不是已弃用的$.browser.version的原因。 - periback2
我本来想使用你的答案,但是我检查了我的代码,发现一个比你的函数简单一点的函数,已经在这里写好并且运行良好,但由于它和你使用的方法相同,我也会接受你的答案。非常感谢。其他人想要具体知道问题所在,但很难确定,因为这是一个最初10年前编写的应用程序,并且当时仅针对IE进行验证...现在正在修复许多问题以实现跨浏览器工作(并且多年前为IE编写了几个hack)...所以你可以有一个想法... - periback2
3
好的,我们有相同的情况 :) 这个应用程序是10年前编写的,原本只支持IE浏览器,但作为当前项目的一部分,我们需要添加跨浏览器支持、现代化样式、MVC等功能。所以我完全理解你的处境 :) - J0HN
谢谢@JOHN :) …有时候我不明白这里在SO的人…如果我试着很好地描述问题,就需要写太多的东西,然后他们又抱怨TLDR。当我只是询问如何做某件事情,就像在这种情况下一样,我并没有尝试获得重构旧代码的帮助(我没有时间去做)……我只需要知道这个或那个信息……他们应该专注于问题本身……某些版主在我的问题之前添加了一个荒谬的链接,指向完全不同于我的问题的另一个问题……但是好吧,你理解我的观点并帮助了我。谢谢! - periback2

16

Internet Explorer具有条件编译功能(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版本的内部值翻译而来)。


3
如果您正在对脚本进行缩小,这个答案建议您使用一个解决方法... - jahroy
@jahroy 说得好,谢谢指出。我记得以前回答过这个问题(“如何针对IE 10进行定位?”),我发誓我的答案包括使用 Function(),就像 eval 一样。我只是找不到那个答案了... - Ian
@Pointy 但是IE10不支持条件注释,对吧?或者在脚本标签中特殊处理了? - Ian
我测试了你的jsfiddle,但它在IE9中返回true,在IE8/7中返回错误:( - periback2
显示剩余8条评论

3

0

我发现自己在IE 9到11(没有检查IE 12)上遇到了一个问题(在带有图例的框架集上的边框半径)。
在IE 11中,MSIE不再是用户代理,而appName是Mozilla,但其中包含trident。 我成功地提取了trident版本号并进行了检测。

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';
}    

0
这里有一个一行解决方案来检测IE 10。
var IE10 = navigator.userAgent.toString().toLowerCase().indexOf("trident/6")>-1;

如需了解其他版本和浏览器的更多信息,请参考浏览器检测链接


0

IE10用户代理字符串表示

However if your site is still using user-agent sniffing, then increasing the “MSIE” token to “10.0” is particularly noteworthy. Why? Because it adds an extra digit to the string value of the token. Most sites will handle this effortlessly, but some will process the extra digit incorrectly, causing them to identify IE10 as IE1.

To help illustrate, here’s a regular expression that only captures the first digit of the “MSIE” token’s value:

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

And here’s one that captures the full value of the “MSIE” token:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接