ページを離れるときに起動するJavaScriptアラートを防ぐ方法は?


12

多くのページには、離れるときにアラートがあります。タブを閉じたり、保存せずに移動したりすると、アラートを確認するまでサイトがアラートを出す/ブロックする理由が多数あります。このページから移動しますか?」

通常、これはonbeforeunloadand / or onunloadハンドラーで行われます。

以下に例を示します。

これらのハンドラーによって生成されるアラート/ユーザーブロックイベントを防ぐ方法はありますか?基本的に、JSを有効のままにしておき、特にクリックが発生することなくページを離れることができないようなことは特に禁止します。

onbeforeunloadonunloadハンドラーは引き続き起動する必要があります。ユーザーをブロックすることを許可しないでください。これは、アラートがなく、数秒以上かかる操作がないことを意味します。

特定のページのJavaScriptを編集/グリースモンキーパッチするプラグインをいくつか見つけて、コードを少し遊んで、より一般的に適用できるようにしました。しかし、私が上で動作解決策を見つけることを望んだすべての試行は、ユーザー出口をブロックするというページを。


それを行うURLを投稿できますか?
ゴリマー

編集、追加された例。また、多くの場合、この動作がしばしば望ましい理由であり、偶発的なデータ損失を防ぐために必要であることを理解しています。私はまだそれを無効/無効にする方法を知りたいです。
ザックB

注:現在のすべての回答(を変更するonbeforeunload)はonbeforeunload、を使用するページでのみ機能し、イベントをアタッチする他の方法のいずれかを使用するページでは機能しません。
Synetech 14年

回答:


7

さて、最も簡単なことは、ページスクリプトを直接オーバーライドし、イベントをに再割り当てすることnullです。

window.onbeforeunload = null;

本当に悪意のない限り、これはどこでも機能し、自分自身で再割り当てを続けます。このような場合、設定を維持するループnullがおそらく機能します。

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

今、警告されます、いくつかのページはこれを永久に使用します。YouTubeアップロードページをご覧ください:アップロード中に別の場所に移動すると、何時間も進歩しなくなった可能性があります。または、入力し直したくないWebフォーム、または再入力したくないメッセージ(フォーラム/メール)を入力します。この機能により、保護されます。

もう1つの問題は、AJAXによるデータの保存など、何らかの二次的な目的でこれを使用するページです。彼らはこのイベントを使用して保存アクションをトリガーし、ユーザーがボタンをクリックしてリクエストが通過するのに十分な時間がかかることを望んでいます。繰り返しますが、これは自分自身からあなたを救うためによく行われます。

しかし、明らかに、多くのページがこれを病気に使用していることを知っています。したがって、作業するページを知っている場合は、常にホワイトリストシステムを使用できます。本当に完全にブロックせずに、このアクションをブロックする方法はありません。また、window.onbeforeunload実行される可能性のある(おそらく良い)アクションもありません。

ポップアップボックスを停止している間、適切なアクションを維持する方法はありません(特定のページコードの予備知識がなければ)。このボックスはありませんalert()。ボックスは、の意図された動作として、ブラウザによって生成されますonbeforeunloadwindow.onbeforeunload文字列を返すために割り当てる関数を作成することで作成します。その文字列はポップアップに出力されます。

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

したがって、関数を消去せずにポップアップをブロックすることはできません。

さらに、方法を見つけた場合、AJAXはすべて失敗します。ポップアップはリクエストを通過する時間を提供します。ポップアップなしでは、データが失われる可能性があります。

についてはonunload、これであなたをブロックすることはできません。ページがアンロードされたに起動するため。しかし、安全にするために、あなたはいつでもすることができます、window.onunload = null;そして、それは世話をされるべきです。


そのような動作はしますが、onbeforeunloadハンドラーが他の重要なことをした場合はどうなりますか?たとえば、短いAJAXリクエストを送信した場合、またはローカルHTML5ストレージに何かをコミットした場合はどうなりますか?onbeforeunloadハンドラーが特定の呼び出し(つまりalert())を実行したり、特定の期間より長く実行したりするのを防ぐ方法はありますか?そのため、私は単なるグリースモンキータイプのスクリプトではなく、拡張機能について質問しました。これを正しく行うには、JavaScriptエンジンレベルで何かを変更する必要があるようです。
ザックB

1
さらに情報を追加しました。これを実際に下位レベルで修正する限り、拡張機能は実際には下位レベルではありません。高いアクセス許可といくつかの特別なAPIがありますが、ブラウザのコア機能を変更する機能はありません。FFプラグインがどの程度深くできるかわかりません。その分野での経験はありません。明らかに、オープンソースであるため、これらの変更を行うことができます。しかし、ポップアップを修正するには少し遠いところです。
zeel

私のために働いていない:(
Phuc Nguyen

0
    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);

1
なぜこのようなスクリプトを作成するのですか?
ブラッド14年

3
@anywho。スクリプトを説明して、他の人が何をしているのかを理解できるようにすると便利です。また、スクリプトの特定の部分を変更してスクリプトを改善したり、一部を完全に異なるスクリプトで使用したりできるため、多くの人が回答を使用できるようにします。とにかく答えを説明して、それが質問にどのように当てはまるかを人々が理解できるようにすることも良い考えです。回答を投稿していただきありがとうございます。
デビッド14年

0

Windowsシステムでの迷惑なポップアップを処理できる便利なツール、ClickOffがあります。こちらからダウンロードできます。私はそれをチェックし、SharePointサイトの「あなたが行った変更は保存されないかもしれない」という警告で動作します。

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