【问题标题】:How do I detect IE10 using javascript?如何使用 javascript 检测 IE10?
【发布时间】:2013-04-28 07:53:54
【问题描述】:

正如许多已经在其他问题中发布的(也在 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) {...

【问题讨论】:

  • 你可以使用 Modernizr。
  • 您似乎只是在尝试修复影响 IE
  • 问题是什么,也许我们可以帮助您解决问题而不是解决它,这样如果它也影响 IE11,但不是 12,您没有一堆 if 语句无处不在(而且您无需触摸代码即可对其进行更新)
  • @Jan Dvorak,回复您对已删除答案的评论 - msdn.microsoft.com/en-us/library/ie/hh801214(v=vs.85).aspx
  • 但真正的问题是什么???我们还没有看到它。与其使用一些有缺陷且不可靠的用户代理嗅探技术,不如您可以相对轻松地解决真正的问题。

标签: javascript jquery cross-browser internet-explorer-10


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    The IE10 User-Agent String

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

    【讨论】:

      【解决方案3】:

      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 不支持条件注释,User-Agent 字符串可能被欺骗。

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

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

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


      更新:

      为了仍然避免缩小 cmets 并结合检测任何版本,您可以使用类似的东西:

      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 版本的内部值转换而来)。

      【讨论】:

      • 如果您要缩小脚本,This answer 会建议您一种解决方法...
      • @jahroy 好点,感谢您指出这一点。我记得之前多次回答过同样的问题(“如何定位 IE 10?”),我发誓我的答案包括使用 Function(),这与 eval 相同。我就是找不到那个答案……
      • @Ian 您也可以使用包裹在脚本标签周围的 IE 条件 cmets 来做到这一点。
      • @Pointy 但是 IE 10 不支持条件 cmets 吗?还是在脚本标签内有什么特别之处?
      【解决方案4】:

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

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

      【讨论】:

      • 我同意你的看法.. 这可能是 jQuery 建议使用 $.support 而不是已弃用的 $.browser.version 的原因
      • 我打算使用你的答案,但我检查了我的代码,发现一个比你的更简单的函数,它已经在这里编写并且运行良好,但它与你使用的方法相同,我也会接受你的回答。非常感谢。其他人想知道具体的问题,但很难确定,因为这是一个最初在 10 年前编写的应用程序,当时它只针对 IE 进行了验证......现在正在修复很多问题工作交叉浏览(很多年前为 IE 编写了几个 hack)......所以你可以有一个想法......
      • 好吧,我们遇到了同样的情况 :) 10 年前编写的应用程序旨在仅支持 IE,作为当前项目的一部分,我们应该添加跨浏览器支持,现代样式,MVC等。所以我完全理解你的情况:)
      • 谢谢@JOHN :)...有时我不理解这里的人...如果我试图很好地描述问题,它需要写太多东西然后他们抱怨是 TLDR。当我问如何做某事时,比如在这种情况下,我并不是想寻求帮助来重构旧的感冒(我没有时间)......我只需要知道这个或那个信息.. . 他们应该专注于这个问题... 一些主持人在我的问题之前添加了那个荒谬的链接,指向另一个与我提出的问题完全不同的问题......但是,你理解我的观点并帮助了我。谢谢!
      【解决方案5】:

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

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

      有关其他版本和浏览器的更多信息,请参阅Link of Browser Detection

      【讨论】:

        【解决方案6】:

        我发现自己在使用 IE 9 到 11(没有检查 IE 12)时遇到问题(带有图例的框架集的边框半径)
        MSIE 在 IE 11 中不再是用户代理,appName 是 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';
        }    
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 1970-01-01
          • 1970-01-01
          • 2013-05-04
          • 1970-01-01
          • 2016-11-07
          相关资源
          最近更新 更多