【问题标题】:jQuery 1.9 browser detectionjQuery 1.9 浏览器检测
【发布时间】:2013-01-10 18:53:45
【问题描述】:

在早期版本中,我曾经测试是否应该在页面加载时手动触发popstate,因为 Chrome 会在加载后立即触发,而 Firefox 和 IE 则不会。

if ($.browser.mozilla || $.browser.msie) {
    $(window).trigger('popstate');
}

现在他们在 1.9 中删除了浏览器对象,我应该如何测试这些浏览器?或者我如何确定是否需要在页面加载时popstate

代码是:

$(function(){
    $(window).on('popstate', popState);

    // manual trigger loads template by URL in FF/IE.
    if ($.browser.mozilla || $.browser.msie) {
       $(window).trigger('popstate');
    }
});

更新

为此:

    function popState(e){
        var initial = e.originalEvent === undefined || e.originalEvent.state === null;
        if(!initial){
            activateRoute({
                key: e.originalEvent.state.key,
                settings: e.originalEvent.state.settings
            },'replace');
        }
    }

    function init(){
        $(window).on('popstate', popState);

        $(function(){
            var route = getRoute(document.location.pathname);
            activateRoute(route, 'replace');
        });
    }

【问题讨论】:

标签: javascript jquery browser-detection browser-feature-detection


【解决方案1】:

我想把这段代码给你了。如果您需要根据您的要求进行更改,请不要忘记进行更改。

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;

供您参考 - jQuery Docs

我们建议不要使用此属性;请尝试使用功能 代替检测(参见 jQuery.support)。 jQuery.browser 可以移动到 jQuery 未来版本中的插件。

jQuery.browser

jQuery.support

【讨论】:

  • 从浏览器重新插入代码不是答案...不是嗅探是。另外,请注明那段巨大的代码,或在 github 存储库中链接到它。那是许可代码。
【解决方案2】:

您应该为您的popstate 处理程序添加一点健全性检查,并确保如果您“弹出”到您开始时的相同状态,它不会做任何昂贵的事情。然后您就不必关心浏览器了,相反,只需在文档就绪时调用您的 popstate:

$(function(){
    $(window).on('popstate', popState);

    // call popstate on document ready
    $(popstate);
});

建议您将 $.browser 中的代码粘贴回您的环境的答案对于支持不良做法来说太过分了。您可以检测 99% 的您需要的东西。几乎每次使用$.browser 都是危险的。 几乎总有办法检测到这一点。

JavaScript 社区长期以来一直反对浏览器嗅探。 Here 是 2009 年的一篇文章,告诉我们为什么这是一个坏主意。还有很多其他的。

我请求你不要将$.browser 复制回你的代码中,jQuery 团队决定取消它是有原因的。

【讨论】:

  • 我没有,我实际上做了类似于你提议的事情。我更新的问题有我得到的解决方案。
  • 另外,我建议您发布最终解决方案的答案,而不是编辑您的问题。这根本不是“糟糕的形式”,实际上是受到鼓励的。
  • 我很欣赏这个答案的最后一行。我正要这样做。
  • 确实如此; “$.browser”已经死了。 jquery 在内部通过“jQuery.support”使用特征检测,但他们强烈建议使用外部库,例如 Modernizr。
【解决方案3】:

Here 是解决此问题的快速方法。 将这行代码添加到您的 jQuery-1.9.js 中,并将 $.browser 替换为 jQuery.browser

jQuery.browser = {};
jQuery.browser.mozilla = /mozilla/.test(navigator.userAgent.toLowerCase()) && !/webkit    /.test(navigator.userAgent.toLowerCase());
jQuery.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase());
jQuery.browser.opera = /opera/.test(navigator.userAgent.toLowerCase());
jQuery.browser.msie = /msie/.test(navigator.userAgent.toLowerCase());

here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 2013-07-29
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2017-02-09
    • 2012-04-09
    相关资源
    最近更新 更多