5

iframe を含むページがあります。iframe は、ユーザーの入力 (ボタンのクリックまたはメニューの選択による) を受け取り、それに応じてコンテンツを表示できます。私が必要としているのは、ユーザーが iframe を操作すると、ブラウザーが iframe パラメーターの各セットを履歴にプッシュすることです。ユーザーが [戻る] ボタンをクリックすると、iframe は以前の履歴エントリから保存されたパラメーターを使用してコンテンツをリロードします。以下に示すように、リロードを行うコードがあります。

奇妙なことに、iframe で複数の設定を行い (したがって、複数の状態エントリが履歴に追加されます)、後ろをクリックすると、次のように動作します。

履歴に状態 4、3、2 があり、現在は状態 5 にあるとします。

  1. 最初のクリックで状態 4 に復元されます (「----state changed----」ログ メッセージが出力されます)。
  2. 2 回目のクリックで、iframe がデフォルトのコンテンツでリロードされます。「----state changed----」は出力されません。リロード コードは呼び出されません。
  3. 3 回目のクリックで状態 3 に復元
  4. 4 回目のクリックは 2 回目のクリックのようなものです
  5. 5回目のクリックで状態2に復元

したがって、状態を正常に復元する各クリックの後、popstate イベントをトリガーし (同じ結果で statechanged イベントも試しました)、別の以前の状態に復元するには 2 回のクリックが必要です。

ここで何が起こっているか知っている人はいますか?前もって感謝します。

History.Adapter.bind(window, "popstate",
    function (event) {
        console.log("----state changed------", History.getState());   
        console.log("----state data------",History.getState().data.state);  

           //code to do reload an iframe to its proper state

    }); 
4

2 に答える 2

4

だから私はこの同じ問題に出くわしました。私たちが持っていた状況はhistory.pushState()、URL を更新するために使用し、その後 のsrc属性を変更していました<iframe>。の を変更することsrc<iframe>、iframe が変更されたことを履歴に追加するようにブラウザに暗黙的に指示します。したがって...

  1. 最初に押し戻したとき、window.historyの popstate が<iframe>の src 属性でトリガーされ、以前の状態に戻されます。
  2. popstateもう一度押すと、最初にスタックにプッシュした状態のイベントがトリガーされます

私たちのソリューションには、URL を更新して状態をスタックにプッシュすることにしたとき<iframe><iframe>.

$("#iFrameID").replaceWith(('<iframe id="iFrameID" src="' + location + '"></iframe>'

<iframe>これにより、タグの更新によってブラウザの履歴が汚染されるという副作用がなくなりました。

于 2014-01-09T22:10:46.630 に答える
0

私は同じ問題を抱えていました.ユーザーをWebサイトの前のページに移動する代わりに、戻るボタンはユーザーをiframe内の前のページに移動しました. 以下のコードは、問題の解決に役立ちます。

iframe.contentWindow.location.replace(href)
于 2015-08-14T15:16:52.027 に答える