JavaScriptを使用してWebページがナビゲートされないようにする


129

JavaScriptを使用してWebページがナビゲートされないようにするにはどうすればよいですか?


このページを離れる理由は何ですか?
Niyaz、

9
質問によれば、JavaScriptはそれをナビゲートさせます...
Shog9


@ Shog9それはタブを閉じている可能性があり、離れてナビゲートします。私の人差し指はそれをしました...
ボブ・スタイン

回答:


159

を使用onunloadすると、メッセージを表示できますが、ナビゲーションが中断されることはありません(遅すぎるため)。ただし、使用onbeforeunloadするとナビゲーションが中断されます。

window.onbeforeunload = function() {
  return "";
}

注:新しいブラウザは「保存されていない変更は失われます」などの上書きできないメッセージを提供するため、空の文字列が返されます。

古いブラウザでは、プロンプトに表示するメッセージを指定できました。

window.onbeforeunload = function() {
  return "Are you sure you want to navigate away?";
}

11
ブラウザは適切なプロンプトを表示します。単に使用するwindow.onbeforeunload = function() { return ""; }
KIM Taegyoon、2016年

しかし、それだけでは不十分です。フォーム内のコントロールはどうですか?彼らもこれを引き起こします。
Fandango68 2017年

1
最新のブラウザでは、カスタムメッセージをプロンプトに表示できません。これは、フィッシャーなどによって悪用されたためです。
Flimm

@Flimmに感謝します。現在のブラウザで正確になるように、回答を更新しました。
ジミーR.ハウツ

@Flimmオンラインユーザーがブラウザータブまたはブラウザーを閉じたときにユーザーのオンラインステータスを更新したいのですが、ソリューションでコードを使用しましたが、機能しませんでした。解決策はありますか?
ナシンバ

23

他の方法は、ここで紹介するとは異なり、このコードのビットはなりません、彼が残したい場合は、ユーザー尋ねる警告を表示するには、ブラウザを引き起こします。代わりに、ブラウザがメモリからページをアンロードする前に、DOMのイベントの性質を利用して現在のページにリダイレクトし、ナビゲーションをキャンセルします。

ナビゲーションを直接短絡することで機能するため、ページが閉じられるのを防ぐために使用することはできません。ただし、フレームバスティングを無効にするために使用できます。

(function () {
    var location = window.document.location;

    var preventNavigation = function () {
        var originalHashValue = location.hash;

        window.setTimeout(function () {
            location.hash = 'preventNavigation' + ~~ (9999 * Math.random());
            location.hash = originalHashValue;
        }, 0);
    };

    window.addEventListener('beforeunload', preventNavigation, false);
    window.addEventListener('unload', preventNavigation, false);
})();

免責事項:あなたはこれを行うべきではありません。ページにフレーム無効化コードが含まれている場合は、作成者の希望を尊重してください。


ユーザーがブラウザを閉じる(閉じるをクリックする)必要がある場合、どのようにモーダルを表示しますか?本当に?

15

私はこのわずかに異なるバージョンで終わりました:

var dirty = false;
window.onbeforeunload = function() {
    return dirty ? "If you leave this page you will lose your unsaved changes." : null;
}

他の場所では、フォームがダーティになったときにダーティフラグをtrueに設定します(または、移動しないようにします)。これにより、ユーザーがナビゲーションの確認プロンプトを表示するかどうかを簡単に制御できます。

選択した回答のテキストを使用すると、冗長なプロンプトが表示されます。

ここに画像の説明を入力してください


3
IEでは、dirtyがfalseの場合、文字列「null」が表示されます。それをifステートメントの中にラップするだけです。参照:stackoverflow.com/questions/11793996/...
ヤコブ・ファン・リンゲン

@JacobvanLingenは同意しました。nullの代わりに終わった場合、これがここと他の3つ 質問に対する最良の回答になりundefinedます。(1)条件付き(2)離れて移動するのを妨げる最も一般的な正当な理由に「汚い」と記載されている、(3)スクリーンショットがある。
ボブスタイン

nullではなくundefinedで終わった場合、これはすべてのブラウザーで機能しますか?
危険

9

最新のaddEventListener APIを使用する、より近代的でブラウザー互換性のある方法で同等のもの。

window.addEventListener('beforeunload', (event) => {
  // Cancel the event as stated by the standard.
  event.preventDefault();
  // Chrome requires returnValue to be set.
  event.returnValue = '';
});

ソース:https : //developer.mozilla.org/en-US/docs/Web/Events/beforeunload


1
正しく大文字にすることを忘れないでくださいevent.returnValue
Flimm

7

Aymanの例では、falseを返すことで、ブラウザウィンドウ/タブが閉じないようにしています。

window.onunload = function () {
  alert('You are trying to leave.');
  return false;
}

2
ブラウザがOperaでない限り、タブ/ウィンドウ/プログラムが閉じられている場合、onunloadイベントはスキップされます。
パワーロード2009年

5

jQuery 1.11で受け入れられている回答に相当するもの:

$(window).on("beforeunload", function () {
    return "Please don't leave me!";
});

JSFiddleの例

altCognitoの回答では、unloadJavaScriptがナビゲーションを中止するには遅すぎるイベントが使用されました。


3

onunloadを使用します

jQueryの場合、これは次のように機能すると思います:

$(window).unload(function() { 
  alert("Unloading"); 
  return falseIfYouWantToButBeCareful();
});

falseを返してもアンロードはキャンセルされませんが、このunloadイベントはユーザーがページを離れたときに発生します。beforeunloadこれは直前に発生するものとは異なります(キャンセルされる場合もあります)
Jimbo

@altCognito:falseIfYouWantToButBeCareful()を使って良いアイディアをくれたので、IEまたはFFによるデフォルトのポップアップを回避できます。しかし、クロムの場合は機能しません。調べてみます。
user367134

3

この提案されたエラーメッセージは、ブラウザがすでに表示しているエラーメッセージと重複する場合があります。Chromeでは、同じウィンドウに2つの同様のエラーメッセージが次々と表示されます。

Chromeでは、カスタムメッセージの後に表示されるテキストは「このページから移動してもよろしいですか?」です。Firefoxでは、カスタムエラーメッセージはまったく表示されません(ダイアログは表示されます)。

より適切なエラーメッセージは次のとおりです。

window.onbeforeunload = function() {
    return "If you leave this page, you will lose any unsaved changes.";
}

または、stackoverflowスタイル:「投稿の作成または編集を開始しました。」


2

ブラウザの戻る/進むボタンをキャッチしていて、ナビゲートしたくない場合は、以下を使用できます。

window.addEventListener('popstate', function() {
    if (window.location.origin !== 'http://example.com') {
        // Do something if not your domain
    } else if (window.location.href === 'http://example.com/sign-in/step-1') {
        window.history.go(2); // Skip the already-signed-in pages if the forward button was clicked
    } else if (window.location.href === 'http://example.com/sign-in/step-2') {
        window.history.go(-2); // Skip the already-signed-in pages if the back button was clicked
    } else {
        // Let it do its thing
    }
});

それ以外の場合は、beforeunloadイベントを使用できますが、メッセージはブラウザー間で機能する場合と機能しない場合があり、組み込みのプロンプトを強制する何かを返す必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.