3

随着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;

}());

优于查看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;
}

来源

4

4 回答 4

5

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

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

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

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

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

于 2013-04-22T10:56:41.107 回答
3

如果你需要支持旧的 IE 版本,你可以坚持使用 jQuery 1.9。jQuery 继续支持 v1.x,专门针对需要支持旧 IE 版本的人。如果您对您的网站将不再在旧 IE 版本中运行感到高兴,请仅迁移到 jQuery v2。

或者,如果您确实想在较新的浏览器上使用 jQuery 2.0 但仍支持旧的 IE 版本,您可以简单地使用条件注释根据 IE 版本在 jQuery 1.9 和 2.0 之间切换。

以下是所有必需的:

<!--[if lt IE 9]><script src="jquery-1.9.1.js"></script><![endif]-->
<!--[if gte IE 9]><!--><script src="jquery-2.0.0b2.js"></script><!--<![endif]-->

这直接取自jQuery 站点上的注释,将为旧 IE 提供 jQuery v1.9,为所有其他浏览器提供 2.0。

除此之外,jQuery 版本 1.9 和 2.0 都具有相同的 API,并且应该工作相同。您问题中的任何 IE 版本检测代码都不是必需的。所以直接回答你的问题“哪个更好?” 是“都不是”。

于 2013-04-22T11:01:13.100 回答
1

正如 Spudley 所说,坚持使用 jQuery 的一个版本可能是目前最好的选择。如果需要支持 IE8 及以下版本,请使用 v1.9.x。如果你很高兴只支持 IE9 及更高版本,v2.x 很好。

有条件地加载任一库都可能导致问题。测试更加困难,如果您发现 jQuery 的 API 有不一致的地方(例如,某些东西在 2.0 中有效,但在 1.9 中无效),修复起来会很尴尬。

通常,应始终避免浏览器嗅探。就个人而言,我也尽量避免使用条件注释。

于 2013-04-22T13:10:55.020 回答
0

如果您想支持两个版本的 jQuery,我相信 Spudley 的解决方案是最好的。但是,如果您不想为两个版本的 jQuery 编程,而只想将用户重定向到支持 IE 版本低于 9 的旧站点,则可以使用:

// This will always tell you if you are running IE, whether the user is faking
// a user agent or not, even in IE 10.
var isMSIE = /*@cc_on!@*/false;
if(isMSIE && parseInt(navigator.userAgent.toLowerCase().split("msie")[1],10) < 9) {
    // Your code to redirect the user to the old site.
    location.href = "old site url";
}

或者

<!--[if lt IE 9]><script>location.href = "old site url"</script><![endif]-->

IE 10 将忽略它,因为它不再支持条件注释,并且低于 9 的 IE 版本将重定向到您的旧站点。

正如 Spudley 所说,您可以只使用 jQuery 1.9.1。

于 2013-12-24T21:16:14.817 回答