如何使用javascript检测IE10?

如何使用javascript检测IE10?,javascript,jquery,cross-browser,internet-explorer-10,Javascript,Jquery,Cross Browser,Internet Explorer 10,正如许多人已经在其他问题(也在jQuery文档中)中发布的一样,旧的jQuery.browser.version已被弃用,仅在jquery1.3中可用 您知道另一种简单的检测方法吗,我可以在之前的代码中包括: function handleInfoDivPopupVisibility(dynamicEleId, staticEleId){ var parentContainer = $('headerSummaryContainer'); var dynamicEle = $(dynamicEl

正如许多人已经在其他问题(也在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);
}
在你说这是重复的or问题之前,我想强调我不想使用css黑客。有没有一种方法可以像以前一样简单地检测到它?

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

jQuery.browser.version仍然有效,但您必须包含jQuery migrate插件

但是,如果您的站点仍在使用用户代理嗅探,那么将“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.]+)/

Internet Explorer具有条件编译()的功能。您可以使用以下选项:

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

您可以将其放在所有JavaScript代码之前,从那时起只需参考
isIE10

条件编译不会在非IE中运行,因此
isIE10
仍将是
false
。而
@\uJScript\u版本
在IE 10中仅以
10
开头

IE 10中不支持条件注释,用户代理字符串可能被伪造

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

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


更新:

为了避免注释缩小,同时也要检测任何版本,您可以使用以下方法:

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.isTheBrowser
IE.actualVersion
(从JScript版本的内部值翻译而来)。

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

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中存在的特定功能,而不是早期版本中的功能。

这里有一个检测IE10的单线解决方案

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

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

我发现自己在IE 9到11(未检查IE 12)方面存在问题(带有图例的框架集上的边界半径)
MSIE不再是IE 11中的用户代理,应用程序名是Mozilla,但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';
}    
if(navigator.appVersion.indexOf('Trident/')>-1){//Begin愚蠢的IE垃圾
var IE=navigator.appVersion;
IE=IE.slice(IE.indexOf('Trident/'))+8;
IE=IE.slice(0,IE.indexOf(';');
IE=数字(IE);

如果(IE>=5&&IE你可以使用Modernizer。看起来你只是想修复一个影响IE的css问题。问题是什么,也许我们可以帮助你解决这个问题,而不是解决它。这样,如果它也影响IE11,但不是12,你不会到处都有一堆if语句(而且你不必触摸你的代码来更新它)@Jan Dvorak,在回复您对删除答案的评论时-但实际问题是什么?我们还没有看到它。与其使用一些有缺陷的不可靠的用户代理嗅探技术,您可能会相对轻松地解决真正的问题。如果您正在缩小脚本,建议您一个解决方法…@jahroy Good point,感谢pointin我记得以前曾多次回答过同样的问题(“如何瞄准IE 10?”),我发誓我的答案包括使用
Function()
这与
eval
一样。我就是找不到答案…@Ian你也可以用围绕脚本标记的IE条件注释来做。@Pointy,但IE 10不支持条件注释吗?或者在脚本标记中它是特别的吗?@Pointy。我同意你的看法。。这可能就是jQuery建议这样做的原因使用$.support,而不是不推荐使用的$.browser.versionI将使用您的答案,但我检查了我的代码,发现一个比您的更简单的函数,它已经在这里编写并运行良好,但由于它与您使用的方法相同,我也将接受您的答案。非常感谢。其他人想知道这是一个问题,但确实很难确定,因为这是一个10年前最初编写的应用程序,当时,它只针对IE进行了验证。现在有很多问题正在解决,以便进行交叉浏览(并且许多年前针对IE编写了一些黑客程序)…因此您可以有一个想法……好吧,我们也遇到了同样的情况:)10年前编写的应用程序只支持IE,作为当前项目的一部分,我们应该添加跨浏览器支持、现代风格、MVC等。因此,我完全理解您的情况:)谢谢@JOHN:)…有时我不理解这里的人,所以…如果我试图很好地描述这个问题,它需要太多的东西当我问如何做一些事情时,比如在这个例子中,我并不是想得到帮助来重构旧的感冒(我没有时间)…我只需要知道这个或那个信息…他们应该关注问题…一些主持人在我的问题指向另一个与我所问完全不同的问题之前添加了荒谬的链接…但是,你理解我的观点并帮助了我。谢谢!