web-dev-qa-db-ja.com

window.onPopStateでe.preventDefaultを実行することは可能ですか?

ユーザーが自分のWebアプリに戻らないようにしようとしています。このために、window.onpopstateをキャッチして、戻るボタンの効果をキャンセルするためにe.preventDefaultを追加しました。

しかし、それは起こらないようです。

window.addEventListener('popstate',function(e){ 
console.log(e); e.preventDefault();  
});

ブラウザのpopstateイベントを防ぐことはできませんか?それとも私は何か間違ったことをしていますか?

15
phoenix

これによると documentation 、popstateイベントはキャンセルできません:

仕様: HTML5
インターフェース:PopStateEvent
泡:はい
キャンセル可能:いいえ
ターゲット:defaultView
デフォルトのアクション:なし

23
Patrick Klug

まず、「不可能」は決して受け入れられる答えではありません。

次に、can popstateのバグを補正します。たとえば、私のリッチエディタは、怠惰な野郎の鍵であるBackspaceを常に補正する必要があります。これは戻るボタンの有効なキーではありませんが(「ページダウン」のスペースバーのように)、ブラウザ拡張機能を追加する代わりに、個人的な好みを世界に押し付けますso人々がそれを押すと、ポップステートはエディターがキーボードキャレットの左側にある文字を削除する代わりにトリガーされます。

次のコード(ここでは依存関係を投稿していません)は、popstateバグがトリガーされたことを検出し、e.preventDefault();で顔を叩き、history.go(1);でアドレスバーアドレスを修正します。ブラウザがDOMを操作することを許可されていないため、エディタを使用している人は何も起こらなかったことに気づきません。このコードは最小限であり(他の人がさまざまなコンテキストでこのバグを補正している可能性があります)、現在Gecko/Firefoxでのみテストしているので、Blink、Presto、Trident、WebKitベースのブラウザーもテストしてください。

window.onpopstate = function(e)
{
 if (id_('editor') && is_node_parent(document.activeElement,id_('editor')))
 {
  e.preventDefault();
  history.go(1);
 }
}
5
John