28

JSレスポンスでこのタイプの回線を使用しています

if (history && history.pushState){
     history.pushState(null, null, '<%=j home_path %>');
}

しかしback、ブラウザをクリックすると、前のページではなく、応答のJSコードが表示されます。

最後のURLのページを再リクエストするように戻るボタンを機能させる方法はありますか(以前home_pathはpushStatedでしたか?

更新

私はこれを見つけまし..他にも同じ問題があるようです..History.jsもそれを修正しません

そこでコメントのいくつかを確認するために..これはクロームでのみ発生します

私が思うこと

このすべての根本は、popstateが同じタイプのpushstateドキュメント(js応答)を要求していることだと思います。実行する必要があるのは、popstateがhtml応答を要求することです。方法がわかりません。

その他の更新:

http://railscasts.com/episodes/246-ajax-history-stateを見て、使用することに言及しています

 $(window).bind("popstate", function() {
      $.getScript(location.href);
    });

これで問題は解決しますが、 ajaxキャッシュなしでjQuery $ .getScript()を理解 すると、タイムスタンプが追加されます。これによりURLが汚染されます。オフにすると、同じ効果で再び機能しなくなります。

誰もがこれを解決する方法を知っていますか?

さらに多くのアップデート

私はインターウェブ全体で問題の痕跡を追跡し、レールの問題を示すクロムの問題(Firefoxは正常に動作します)と、応答にVaryヘッダーを含めないことに関するrails-ujsの問題で終わりました

例はここにあります

4

4 に答える 4

12

私は現在やって遊んでいます

 response.headers['Vary'] = 'Accept'

一見したところ、これで問題は解決したようです。

誰かが同じ問題を抱えている場合は、それをチェックして私に知らせてください

于 2013-04-04T07:28:35.683 に答える
7

popstateイベントにリスナーを追加する必要があります

window.onpopstate = function(event) {
    //load the page
};

戻るボタンを押すと、URLが変更され、popstateイベントが発生します。変更されたURLと一致する詳細をpopstateリスナーにロードするのはあなたの責任です。

ポップステートの良い例

一部のブラウザは、ページが最初に読み込まれたときにpopstateイベントを発生させ、無限のページ読み込みループを引き起こします。これは、次のチェックを追加することで回避できます

var loadPage = window.history.state;
window.onpopstate = function(event) {
    if (loadPage) 
        //load the page
};

次に、pushStateが呼び出されたときにloadPageをtrueに設定します

history.pushState(null, null, '<%=j home_path %>');
loadPage = true;

この手法は、html5履歴APIをサポートするすべてのブラウザーで機能します。

于 2013-03-22T22:28:05.813 に答える
3

それは私がシナトラとクロームで起こった。

それを解決しました:

$.ajaxSetup({ cache: false });
于 2013-04-04T07:48:57.427 に答える
0

ローカルHTMLファイルを使用してブラウザでこのコードをテストしましたが、コンソールのセキュリティエラーが発生しました。

SecurityError: The operation is insecure.
  history.pushState(null, null, '<%=j home_path %>');

ブラウザの履歴を操作することが潜在的に危険な動作と見なされる可能性があることがわかります。したがって、これが自分にも発生していないことを確認する必要があると思います。FirebugJavascriptコンソールを使用してみてください。ローカルHTMLファイルとhttp://HTMLファイルの動作に違いがある可能性もあります。

つまり、配列の最後の要素historyは基本的に現在のページであるため、前の要素を変更する場合は、2つのpushState()コマンドを使用して変更できます。最初に前の要素をプッシュします。あなたが望むなら、あなたは現在の道を再び押します。私があなたの問題を正しく理解したなら。

于 2013-03-19T09:46:01.330 に答える