使用导航器对象/用户代理嗅探检测IE版本的缺点

Joh*_*han 3 javascript internet-explorer cross-browser browser-feature-detection

随着jQuery 2.0发布,已经有很多关于如何识别用户是否正在使用支持它的IE版本的讨论(jQuery 2.0仅支持IE9及更高版本).

我的问题是,为什么像一个解决方案这样:

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

}());
Run Code Online (Sandbox Code Playgroud)

比查看navigator对象更受欢迎:

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}
Run Code Online (Sandbox Code Playgroud)

资源

Bol*_*ock 5

功能检测(在这种情况下,检测对条件注释的支持)是可靠的,因为您知道给定浏览器的给定版本以某种方式实现了给定功能.即使更高版本删除了此功能(在这种情况下,在IE10中删除了条件注释),它也不会改变以前版本实现它的方式.同样,对于之前未实现的功能以及稍后在较新版本中引入的功能.

使用标准时,功能检测通常也与供应商无关.您正在查看浏览器是否支持某项功能,无论它是什么类型的浏览器.这有助于促进浏览器之间的互操作性,同时避免不必要的歧

另一方面,在处理用户代理字符串时,您依赖于可以通过各种方式操作的任意字符串的值,而不仅仅是第三方或作者代码,甚至是用户代理本身.此字符串很复杂且难以解析,并且通常尝试解析它的代码将以惊人的方式失败.这就是UA嗅闻如此不可靠的原因.

现代.IE更好地解释了缺点:

始终更喜欢通过浏览器(navigator.userAgent)检测进行特征检测.
userAgent字符串是指示特定功能(或错误)是否存在的不良指示符.为了解决这个问题,许多解释userAgent的代码都是错误的.例如,一个浏览器嗅探库预计主要版本只是一个数字,所以它报告Firefox 15为Firefox 1,IE 10为IE 1!直接检测特征或问题更可靠,并将其用作代码分支的决策标准.我们建议使用Modernizr作为实现特征检测的最简单方法.