什么是jquery.browser的快速,纯粹的javascript替换(在jquery 1.9中删除)?

时间:2013-01-17 12:50:23

标签: javascript jquery browser-detection

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

我的代码库中有一个案例,我们使用$.browser.msie$.browser.version来决定是否渲染一些CSS。编写代码的开发人员不再和我们在一起,而且我并不完全明白我应该在这里写什么样的特征检测。

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

4 个答案:

答案 0 :(得分: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;
})();

答案 1 :(得分:4)

使用conditional comments代替JavaScript。

<!--[if lte IE 7]>
<link rel="stylesheet" href="ie.css" type="text/css">
<![endif]-->

答案 2 :(得分: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]-->

答案 3 :(得分:1)

JQuery发布了一个Migrate plugin,当与1.9一起使用时恢复$ .browser。务必在生产服务器上使用Migrate的生产版本。开发版本将生成一堆控制台消息,告诉您代码将在1.9 sans Migrate中断。

然而,使用JQuery Migrate恢复$ .browser可能不是最好的长期解决方案。顾名思义,它旨在作为过渡工具,我不知道它的浏览器检测功能将得到积极维护。另一种选择是Modernizr

我个人将要做的是暂时将我的生产站点保留在JQ 1.8上,并在我的开发机器上使用开发版本的Migrate进行测试,以更好地了解1.9将会破坏(他们做了一个在决定升级策略之前,不仅要删除$ .browser。