3

chrome と popstate イベントに関連するトピックがたくさんあることは知っていますが、chrome をバージョン 35 にアップグレードした後、新しいトピックに遭遇しました。

これはケースです:

カテゴリやページなどを選択すると、カテゴリとフィルタを含む一覧ページが表示されます。コンテンツは ajax を介してリロードされ、すべて正常に動作する履歴 API によって処理されます。

しかし、リストのアイテムの詳細ページに移動すると-標準リクエスト、ページ全体がリロードされます-ブラウザの戻るボタンを押すと、アイテムを最後にクリックした位置にリストページが表示されますが、ポップステートがトリガーされます(そして私はしません初期ページ読み込み時のクロム popstate についてはここでは話さないでください (バージョン 34 では、popstate は init でトリガーされなくなりました)。また、前述のカテゴリを処理するためのコードにより、ページ全体がリロードされます。

問題は、戻るボタンを押した後に chrome 35 が popstate イベントをトリガーすることです。私の質問は次のとおりです。

ユーザーが詳細ページからリスティング ページに戻った後に、このイベントがトリガーされたことを検出して、このページをリロードしないようにする方法。

ドキュメントオブジェクトのリファラーなどで試してみますが、初めて解決したように見えるときは、うまくいかない場合が常にありました。

4

1 に答える 1

0

私はこの問題に遭遇しました。私の解決策は少しハックですが、それ以外の場合はかなりうまくいくようです。onpopstate ハンドラーをセットアップする前に 150 ミリ秒待機するだけで、Chrome が最初の onpopstate ハンドラーを実行するのを待つのに十分であることがわかりました。これを「利点」として使用できます。たとえば、最初の onpopstate が実行されたかどうかを検出するには、次のようにします。

// wait for page to load
$(function() {
  var no_initial_onpopstate = true;
  var enabled = true;

  window.onpopstate = function() {
    if(!enabled) return;
    console.log("detected initial onpopstate");
    no_initial_onpopstate = false;
  }

  setTimeout(function() {
    enabled = false;
    console.log("No initial onpopstate: ", no_initial_onpopstate);

    // no_initial_onpopstate indicates if the browser emitted an initial
    // onpopstate event. Do with that information what you will

    // 150ms delay seems to be the "magic number" to wait for Chrome to
    // run all of its initial onpopstate handlers (in my tests on localhost, at least)
  }, 150);
});

したがって、このことから、ブラウザの DOM Ready イベントの 150 ミリ秒後に「onpopstate」コールバックを設定すると、chrome の最初の onpopstate がスキップされることがわかります。

于 2014-08-13T07:49:28.523 に答える