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

2024-05-02

随着jQuery 2.0 发布 http://blog.jquery.com/2013/04/18/jquery-2-0-released/,已经有很多关于如何识别用户使用的IE版本是否支持的讨论(jQuery 2.0仅支持IE9及更高版本)。

我的问题是为什么像这样的解决方案this https://gist.github.com/padolsey/527683:

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;

}());

优先于查看navigator object:

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

Source http://msdn.microsoft.com/en-us/library/ms537509%28v=vs.85%29.aspx


功能检测(在本例中,检测对条件注释的支持)是可靠的,因为您知道给定浏览器的给定版本已经以某种方式实现了给定功能。即使更高版本删除了此功能(在本例中,条件注释在 IE10 中被删除),也不会改变以前版本的实现方式。对于之前未实现但后来在新版本中引入的功能也是如此。

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

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

现代IE http://www.modern.ie/en-us/cross-browser-best-practices更好地解释了缺点:

始终更喜欢功能检测而不是浏览器 (navigator.userAgent) 检测。
userAgent 字符串不能很好地指示是否存在特定功能(或错误)。使问题更加复杂的是,许多解释 userAgent 的代码都错误地执行了此操作。例如,一个浏览器嗅探库预计主要版本仅为一位数字,因此它将 Firefox 15 报告为 Firefox 1,将 IE 10 报告为 IE 1!更可靠的是直接检测功能或问题 http://msdn.microsoft.com/en-us/magazine/hh475813.aspx,并将其用作代码分支的决策标准。我们推荐现代化 http://modernizr.com作为实现特征检测的最简单方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐