89

onbeforeunloadイベントが iPad でサポートされているかどうか、および/またはそれを使用する別の方法があるかどうかを知っている人はいますか?

私はほとんどすべてを試しましonbeforeunloadたが、iPad (Safari ブラウザー) ではイベントがトリガーされないようです。

具体的には、これは私が試したことです:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (上記の両方を一緒に)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (上記のすべての関数が内部にあります<body onbeforeunload="...">

これらはすべて、PC の FF と Safari では機能しますが、iPad では機能しません。

また、ページを読み込んだ直後に次のことを行いました。

alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);

それぞれの結果は次のとおりです。

  • true
  • object
  • null

したがって、ブラウザにはプロパティがありますが、何らかの理由で起動されません。

ページから移動しようとする方法は、戻るボタンと進むボタンをクリックすること、トップバーで Google 検索を行うこと、アドレスバーの場所を変更すること、ブックマークをクリックすることです。

何が起こっているのか誰にもわかりませんか?ご意見をいただければ幸いです。

ありがとう

4

8 に答える 8

24

この JavaScript のビットは、ipad と iphone の Safari と Chrome、およびデスクトップ/ラップトップ/その他のブラウザーで機能します。

var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i);
var eventName = isOnIOS ? "pagehide" : "beforeunload";

window.addEventListener(eventName, function (event) { 
    window.event.cancelBubble = true; // Don't know if this works on iOS but it might!
    ...
} );
于 2015-06-25T01:08:45.183 に答える
20

onunload()イベントが発生することがわかりました。その振る舞いはやや奇妙です。イベントにアタッチされたコールバック関数にあるものはすべて、新しいページがバックグラウンドでロードされた後に実際に実行されます(まだロードされているかどうかはわかりませんが、サーバーログにはロードされていることが示されます)。

さらに奇妙なことに、onunload()でconfirm()呼び出しがあり、ユーザーがリンクをクリックして別の場所に移動した場合、あなたは仕事をしています。ただし、ユーザーがiPad Safariブラウザータブを閉じると、onunload()イベントが発生しますが、confirm()は応答として暗黙的にキャンセルされます。

于 2011-01-28T02:09:25.560 に答える
6

確かに知っているのはAppleだけですが、モバイルSafariでその機能を意図的に有効にしなかったのは、怪しげなキャラクターがサイトにとどまったり、ポルノや広告のウィンドウをたくさん表示したりするために最もよく使用されるためだと思います。

于 2010-07-14T16:53:47.233 に答える
3

onbeforeunloadを使用したWebKitの既知のバグがあります。Chrome 5の最新のベータ版で修正されたと思いますが、iPadのブラウザーが修正されていないバージョンのWebKitで作成されている可能性があります。

関連するChromeのバグレポート

于 2010-07-14T17:36:44.800 に答える
3

beforeunload イベントは Mobile Safari ではサポートされていません。サポートされているすべてのイベントのリストは、次の場所で確認できます:イベントの処理 Apple ドキュメント

そして beforeunload はリストにありません!

于 2015-05-07T13:08:29.193 に答える
2

https://code.google.com/p/chromium/issues/detail?id=97035

聞く。

ページの終了イベント (beforeunload、unload、pagehide) 中のアラートは許可されなくなりました。

アラート、プロンプト、確認、およびこれらのような他のアクションも許可されなくなったと思います。

于 2015-01-09T07:05:24.360 に答える
2

最新のすべてのブラウザで機能するはずのソリューションを次に示します。

var unloaded = false;
window.addEventListener("beforeunload", function(e)
{
    if (unloaded)
        return;
    unloaded = true;
    console.log("beforeUnload");
});
window.addEventListener("visibilitychange", function(e)
{
    if (document.visibilityState == 'hidden')
    {
        if (unloaded)
            return;
        unloaded = true;
        console.log("beforeUnload");
    }
});

beforeunloadモバイル ブラウザーは、ページをアンロードせずにバックグラウンドに移行し、いつでもオペレーティング システムによって強制終了される可能性があるため、サポートしない傾向があります。

visibilityStateほとんどのデスクトップ ブラウザには、ドキュメントのアンロード時に が呼び出されない原因となるバグが含まれています。参照:こちら

したがって、すべてのシナリオをカバーするには、両方のイベントを含めることが重要です。

注意

またはから呼び出されたときに一部のブラウザによってブロックされるため、例ではconsole.log代わりにを使用しました。alertalertbeforeunloadvisibilitychange

于 2018-10-17T22:33:06.363 に答える
1

ページが残っているかどうかを知りたいだけの場合は、 を使用できますdocument.unload。iOSブラウザでは問題なく動作します。Apple のドキュメントを見ると、非推奨であり、document.pagehide の使用が推奨されていることがわかります。

于 2014-10-04T13:57:20.387 に答える