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

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

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

6 回答 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 中存在的特定功能,但早期版本中没有。

于 2013-05-03T20:33:20.613 回答
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只会从10IE 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 版本的内部值转换而来)之类的属性。

于 2013-05-03T20:28:18.003 回答
3

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

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

于 2013-05-03T20:25:51.773 回答
0

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

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

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

于 2014-02-28T05:23:44.343 回答
0

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.]+)/
于 2013-05-03T20:26:24.820 回答
0

我发现自己在 IE 9 到 11(没有检查 IE 12)中遇到问题(框架集上的边框半径)(没有检查 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';
}    
于 2014-11-30T22:18:15.703 回答