IPadでonbeforeunload
イベントがサポートされているかどうか、および/またはそれを使用する別の方法があるかどうかを知っていますか?
私はほとんどすべてを試しましたが、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
そのため、ブラウザにはプロパティがありますが、何らかの理由で起動しません。
ページから移動する方法は、戻るボタンと進むボタンをクリックする、トップバーでグーグル検索を行う、アドレスバーで場所を変更する、ブックマークをクリックすることです。
誰が何が起こっているのか知っていますか?どんな入力でも大歓迎です。
ありがとう
Onunload()イベントが発生することがわかりました。その動作はやや奇妙です。イベントにアタッチされたコールバック関数にあるものはすべて、新しいページがバックグラウンドでロードされた後に実際に実行されます(まだロードされていることはわかりませんが、サーバーのログにはそのことが示されます)。
さらに奇妙なことに、onunload()でconfirm()コールがあり、ユーザーがリンクをクリックして他の場所に移動した場合、あなたは仕事をしています。ただし、ユーザーがiPad Safariブラウザータブを閉じると、onunload()イベントが発生しますが、confirm()は応答として暗黙的にキャンセルされます。
このJavaScriptの一部は、Safariで動作し、Chrome iPadおよびiPhone、デスクトップ/ラップトップ/その他のブラウザで動作します。
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!
...
} );
Appleは確かに知っているだろうが、私の推測では、サイトやポップに滞在するために怪しげなキャラクターが最もよく使用するため、モバイルSafariでその機能を意図的に有効にしたわけではない。たくさんのポルノ/広告ウィンドウをアップします。
beforeunloadイベントは、Mobile Safariではサポートされていません。ここでサポートされているすべてのイベントのリストを見ることができます: イベントの処理Apple documentation
そして、beforeunloadはリストにありません!
Onbeforeunloadには WebKitの既知のバグ があります。 Chrome 5の最新のベータ版で修正されたと思いますが、iPadのブラウザが修正されていないバージョンのWebKitで作成されている可能性は十分にあります。
https://code.google.com/p/chromium/issues/detail?id=97035
聞こえます.
ページ破棄イベント(アンロード、アンロード、ページ非表示の前)中のアラートは許可されなくなりました。
アラート、プロンプト、確認など、これらのようなアクションも許可されなくなったと思います。
ページが残っているかどうかを知る必要がある場合は、document.unload
。 iOSブラウザで正常に動作します。 Appleのドキュメント に表示されている場合、これは非推奨であり、document.pagehideを使用することをお勧めします。
以下は、最新のすべてのブラウザーで機能するソリューションです。
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
が呼び出されないバグが含まれています。 here を参照してください。
したがって、すべてのシナリオをカバーするために両方のイベントを含めることが重要です。
[〜#〜] nb [〜#〜]
alert
またはalert
から呼び出されたときにbeforeunload
が一部のブラウザによってブロックされるため、この例ではvisibilitychange
の代わりにconsole.log
を使用しました。