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開始時と同じ状態に「ポップ」した場合に高額な処理が行われないことを確認する必要があります。そうすると、ブラウザーを気にする必要がなくなり、代わりにポップステートを呼び出すだけです。ドキュメントの準備ができました:

$(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;

参考までに-jQueryDocs

このプロパティの使用はお勧めしません。代わりに機能検出を使用してみてください(jQuery.supportを参照)。jQuery.browserは、jQueryの将来のリリースでプラグインに移動される可能性があります。

jQuery.browser

jQuery.support

于 2013-01-27T06:29:44.260 に答える