什么是一个快速、纯粹的 JavaScript 替代方案来替换 jQuery.browser(在 jQuery 1.9 中已删除)?

5

是的,我知道特性检测更可取。

在我的代码库中有一个案例,我们使用$.browser.msie$.browser.version来决定是否渲染一些CSS。编写代码的开发人员已经离开了公司,我不太明白应该在这里写哪种特性检测。

作为一个快速的解决方案,实现$.browser.msie和$.browser.version的最简短方法是什么?


1
最简单的选择难道不是不升级jQuery吗?这样你就不需要做任何改变了。 - James Allardice
为什么你需要检测浏览器呢?你可以使用 modernizr 来进行特性检测,而不是进行浏览器检测。 - Michał Miszczyszyn
@JamesAllardice - 我们正在开发一个扩展,我们的客户可以选择他们想要的任何jQuery版本。 - ripper234
@Miszy - 我现在有一个生产问题,我宁愿不去考虑我需要哪些具体功能,而是实现缺失的API。 - ripper234
4
有时候,针对特定浏览器进行优化是有意义的。例如,在IE8及其以下版本中,当页面上的任何元素被调整大小时,都会调用window.resize方法,但在IE9中不会。此情况无法通过Modernizr进行检测。坚持“永远不使用浏览器检测”的信条让我想起了“永远不使用HTML表格”的信条。因此,我们应该说“适度使用,在确实必要的情况下使用”。 - bergie3000
@bergie3000 我完全同意。我只是在问目的,因为也许可以尝试进行功能检测。 - Michał Miszczyszyn
4个回答

11

我将只是复制来自jQuery 1.8.3的代码。

// Limit scope pollution from any deprecated API
(function() {

var matched, browser;

// Use of jQuery.browser is frowned upon.
// More details: http://api.jquery.com/jQuery.browser
// jQuery.uaMatch maintained for back-compat
jQuery.uaMatch = function( ua ) {
    ua = ua.toLowerCase();

    var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
        /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
        /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
        /(msie) ([\w.]+)/.exec( ua ) ||
        ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
        [];

    return {
        browser: match[ 1 ] || "",
        version: match[ 2 ] || "0"
    };
};

matched = jQuery.uaMatch( navigator.userAgent );
browser = {};

if ( matched.browser ) {
    browser[ matched.browser ] = true;
    browser.version = matched.version;
}

// Chrome is Webkit, but Webkit is also Safari.
if ( browser.chrome ) {
    browser.webkit = true;
} else if ( browser.webkit ) {
    browser.safari = true;
}

jQuery.browser = browser;
})();

4
使用条件注释代替JavaScript。
<!--[if lte IE 7]>
<link rel="stylesheet" href="ie.css" type="text/css">
<![endif]-->

谢谢,这对我来说不相关,我需要一个纯JavaScript的解决方案(开发一个JavaScript插件到第三方网站)。 - ripper234
1
@ripper234 请参阅 http://stackoverflow.com/questions/5653788/is-there-a-way-to-introduce-internet-explorer-conditional-comments-using-javascr - Max Nanasy

1
一种快速解决方案,以使脚本在进行适当重构之前不会崩溃(如果需要,添加其他版本的条件注释):
<!--[if IE 7]>
<script> if(typeof $!== typeof undefined){ $.browser = { msie : true, version : 7 }} </script>
<![endif]-->
<!--[if IE 8]>
<script> if(typeof $!== typeof undefined){ $.browser = { msie : true, version : 8 }} </script>
<![endif]-->

1
JQuery发布了一个Migrate插件,当与1.9一起使用时,可以恢复$.browser。只需确保在生产服务器上使用Migrate的生产版本。开发版本会生成一堆控制台消息,告诉您在没有Migrate的情况下1.9中代码将会出现问题。
然而,长期使用JQuery Migrate来恢复$.browser可能不是最好的解决方案。正如其名称所示,它旨在作为过渡工具使用,我不知道它的浏览器检测功能是否会得到积极维护。另一种选择是Modernizr
个人认为,在决定升级策略之前,我将继续在生产网站上使用JQ 1.8,并在我的开发机器上使用Migrate的开发版本进行测试,以更好地了解1.9将会破坏的内容(他们做了比删除$.browser更多的事情)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接