【问题标题】:What's a quick, pure javascript replacement for jquery.browser (removed in jquery 1.9)?什么是 jquery.browser(在 jquery 1.9 中删除)的快速、纯 javascript 替代品?
【发布时间】:2013-01-01 00:27:37
【问题描述】:

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

我的代码库中有一个案例,我们使用$.browser.msie$.browser.version 来决定是否渲染一些CSS。写代码的开发者已经不在我们身边了,我也不完全明白应该在这里写什么样的特征检测。

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

【问题讨论】:

  • 不升级 jQuery 不是最简单的选择吗?那么你根本不需要改变任何东西。
  • 为什么需要检测浏览器?您可以使用modernizr 代替浏览器检测来进行特征检测。
  • @JamesAllardice - 我们正在开发一个扩展,我们的客户可以选择他们想要的任何 jQuery 版本。
  • @Miszy - 我现在有一个生产问题,不想考虑我到底需要哪些功能,而只是实现缺少的 API。
  • @Miszy - 有时定位浏览器是有意义的。例如,当页面上的任何元素被调整大小时,IE8 及以下版本会调用 window.resize。 IE9 没有。 Modernizr 中没有任何东西可以检查这一点。 “从不使用浏览器检测”教条让我想起了“从不使用 html 表格”教条。让我们改为“谨慎使用,仅在真正合适的时候使用”。

标签: javascript jquery browser-detection


【解决方案1】:

我只是从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;
})();

【讨论】:

    【解决方案2】:

    使用 conditional comments 代替 JavaScript。

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

    【讨论】:

    【解决方案3】:

    快速修复,这样脚本在正确重构之前不会中断(如果需要,可以为其他版本添加条件 cmets):

    <!--[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]-->
    

    【讨论】:

      【解决方案4】:

      JQuery 发布了一个Migrate plugin,它在与 1.9 一起使用时恢复 $.browser。请务必在生产服务器上使用 Migrate 的生产版本。开发版本会生成一堆控制台消息,告诉您在 1.9 无迁移的情况下您的代码会在哪里中断。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多