19

在早期版本中,我曾经测试是否应该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');
        });
    }
4

3 回答 3

21

您应该为您的处理程序添加一点完整性检查popstate,并确保如果您“弹出”到您开始时的相同状态,它不会做任何昂贵的事情。然后您可以不关心浏览器,而只需调用您的 popstate准备好文件:

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

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

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

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

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

于 2013-02-11T22:13:51.333 回答
7

是解决此问题的快速方法。将这行代码添加到您的 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());

这里

于 2013-05-15T12:01:00.123 回答
5

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

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

于 2013-01-27T06:29:44.260 回答