[解決済み] AJAXアプリケーションで戻るボタンへの呼び出しを拒否する
質問
AJAXアプリを持っています。ユーザーがボタンをクリックすると、ページの表示が変更されます。ユーザーは元の状態に戻ることを期待して戻るボタンをクリックしますが、その代わりにブラウザで前のページに移動します。
戻るボタンのイベントをインターセプトして再割り当てするにはどうしたらよいでしょうか。RSH のようなライブラリを調べましたし (これは動作させることができませんでしたが...)、ハッシュ タグを使用するとどうにかなると聞きましたが、意味がわかりません。
どうすれば解決するのでしょうか?
あ、戻るボタンだ。戻る」ボタンを押すと、JavaScript のイベントが発生し、それをキャンセルすることができます。
document.onHistoryGo = function() { return false; }
いいえ、そうではありません。単にそのような事象がないだけです。
もし、本当に ウェブ アプリ (いくつかの ajaxy 機能を持つ単なる Web サイトではなく) を本当に持っているなら、(あなたが言うように、URL のフラグメントを使用して) 戻るボタンを引き継ぐのは妥当です。Gmailはこれを行います。私が言っているのは、Web アプリがすべて 1 つのページ内にあり、すべて自己完結している場合についてです。
テクニックは簡単です。ユーザーが何かを変更するアクションを取るときはいつでも、すでにいるのと同じ URL にリダイレクトしますが、別のハッシュ フラグメントを使用します。たとえば
window.location.hash = "#deleted_something";
...
window.location.hash = "#did_something_else";
Web アプリケーションの全体的な状態がハッシュ化可能である場合、これはハッシュを使用するのに最適な場所です。たとえば、電子メールのリストがあるとすると、すべての電子メールの ID と既読/未読のステータスを連結して MD5 ハッシュを作成し、それをフラグメント ID として使用することができます。
この種のリダイレクト (ハッシュのみ) は、サーバーから何かを取得しようとはしませんが、ブラウザの履歴リストにスロットを挿入することはできます。したがって、上記の例では、ユーザーが "back" を押すと、次のように表示されます。 #deleted_something と表示されています。もう一度「戻る」を押すと、まだあなたのページにいますが、ハッシュは表示されていません。次にもう一度戻ると、彼らは 実際に に戻ります。
さて、難しいのは、JavaScriptでユーザーが戻ったことを検知することです(それで状態を元に戻すことができます)。あなたがすることは、ウィンドウの位置を監視し、それがいつ変更されるかを見ることだけです。ポーリングで。(ポーリングなんて嫌ですよね。でも、クロスブラウザーでこれ以上のものはありません)。しかし、前進したか後退したかは分からないので、ハッシュの識別子を工夫する必要がある。(おそらく、ハッシュをシーケンス番号と結合したもの...)
これがコードの骨子です。(これはjQuery Historyプラグインが動作する方法でもあります。)
var hash = window.location.hash;
setInterval(function(){
if (window.location.hash != hash) {
hash = window.location.hash;
alert("User went back or forward to application state represented by " + hash);
}
}, 100);
関連
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] jQuery Ajax呼び出し後のリダイレクトリクエストを管理する方法
-
[解決済み] テキストボックスのEnterキーで、JavaScriptでボタンクリックをトリガーする
-
[解決済み] HTMLバックリンクの作り方
-
[解決済み] JSのDateからDay名
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?
-
[解決済み] Ajax、戻るボタン、DOMの更新
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] Node.jsでbase64エンコードされた画像をAmazon S3へアップロードする
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行