8

これは私が使用したコードですwindow.onbeforeunload

<head>
<script>

    window.onbeforeunload = func;
    
    function func() 
    {
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = stateChanged;
        request.send(null);
    }
    function stateChanged()
    {
        if (request.readyState == 4 || request.readyState == "complete")
            alert("Succes!");
    }
    </script>
</head>

これはIEMozillaでは動作しますが、 Chromeでは動作しません..... 助けてください... よろしくお願いします.....

4

10 に答える 10

13

私はこれに遅れていることを知っていますが、なぜ私のカスタム beforeunload メッセージが Chrome で機能せず、これを読んでいたのか頭を悩ませていました。したがって、他の誰かが同じことをした場合に備えて、バージョン 51 以降の Chrome は、アンロード前のカスタム メッセージをサポートしなくなりました。どうやら、この機能がさまざまな詐欺によって悪用されているためです。代わりに、目的に合う場合と合わない場合がある定義済みの Chrome メッセージが表示されます。詳細:

https://developers.google.com/web/updates/2016/04/chrome-51-deprecations?hl=ja#remove-custom-messages-in-onbeforeload-dialogs

個人的には、彼らが選んだメッセージは素晴らしいものだとは思いません。サイトを離れることに言及しているためです。また、onbeforeunload の最も一般的な正当な用途の 1 つは、ダーティ フラグの処理/Web フォームでのチェックであるため、多くの場合、素晴らしい言葉遣いではありません。ユーザーがまだあなたのサイトにいる時間のうち、誤ってキャンセルまたはリロード ボタンをクリックしただけです。

于 2016-06-30T17:28:03.970 に答える
4

この動作は chrome 21.0.1180.79 で確認済み

これは、XSS と同じ制限で動作するようです。ページを更新するか、同じドメイン + ポートでページを開くと、スクリプトが実行されます。それ以外の場合は、文字列 (または同様のもの) とダイアログが表示され、ページを傾けるか、ページにとどまるかをユーザーに尋ねます。

onunload/onbeforeunload は、ページの変更を要求/防止するためだけに使用されるわけではないため、これは信じられないほど愚かなことです。

私の場合、私もそれを使用していましたが、ページ編集中に行われたいくつかの変更を保存し、ユーザーがページを変更するのを防ぎたくありません(少なくとも、クロムはtrueを返すことを尊重するか、戻り値が文字列ではないかどうかを尋ねることなくページを変更する必要があります)、スクリプトの実行時間の制限で十分です。

これは、ページをアンロードするときに onblur イベントが編集要素に送信されず、現在のページを単純に無視して別のページにジャンプするため、クロムでは特に厄介です。したがって、変更を保存する唯一の変更はアンロードプロセスであり、ユーザーが変更したい場合は STUPID の質問なしでは実行できません... もちろん彼はそれを望んでおり、私はそれを防ぎたくありませんでした...

クロムがこれをよりエレガントな方法ですぐに解決することを願っています。

于 2012-08-18T14:38:07.973 に答える
1

これを試して。私はそれを試してみましたが、うまくいきます。興味深いですが、Succes メッセージは他のメッセージのように確認を必要としません。

window.onbeforeunload = function() 
{
    if ( window.XMLHttpRequest )
    {
        console.log("before"); //alert("before");
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = function () {
            if ( request.readyState == 4 && request.status == 200 )
            {
                console.log("Succes!"); //alert("Succes!");
            }
        };
        request.send();
    }
}
于 2011-02-06T11:02:56.267 に答える
0

私はMacOS High SierraでChromeを実行しており、window.beforeunloadイベントとwindow.onbeforeunloadイベントを処理するAngular 6プロジェクトを持っています。あなたはそれを行うことができます、それは私のために働いています:

handleUnload(event) {
  // Chrome
  event.returnValue = true;
}

event.returnValue に文字列を入れようとするとエラーが表示されます。ブール値が必要です。

于 2018-07-18T14:36:35.653 に答える