window.onbeforeunloadがiPadで機能しませんか?


84

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

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

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

誰かが何が起こっているのかについて何か考えがありますか?ご意見をいただければ幸いです。

ありがとう


ご意見ありがとうございます。それはあなたが言及した理由の1つであるに違いありません。残念ながら、これやその他の制限に関するAppleからの公式ドキュメントはありません。うまくいけば、彼らはこの機能を悪用することを防ぎながら、この機能を有効にするより創造的な方法を思い付くでしょう。誤ってページをタップして、フォームに入力したすべてのデータを失うという話をよく耳にします。
アートザンブラノ2010

使ってみましたaddEventListener()か?
Hello71 2011年

2
beforeunloadiOSのSafariでは動作しないと確信しています。:-(おそらくあなたは、探しているが、私はのための提案を持っていないものをどのように作業のために確実にテストbeforeunload
ピーターV.Mørch

1
2016年3月3日、iOS9.2.1のwindow.onbeforeunload = function(event) { event.returnValue = 'test'; }ChromeとSafariの両方で機能しません。onbeforeunloadキャンセルをクリックしてもページが変わらないのでとても気に入っています。
vanduc1102 2016年

この問題は、SafariとiOSの13で解決されたように思える
フィネス

回答:


20

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

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


ええと、この確認の癖(確認メッセージの前に2ページ目がヒットする)は、モバイルサファリだけでなくFirefox(そしておそらく他の人)にも当てはまるようです。あなたはただ私の心を吹き飛ばしました。
Amalgovinus 2011

4
unloadイベントは、のために廃止pagehide見るdeveloper.apple.com/library/ios/documentation/AppleApplications/...
sol0mka

1
@ sol0mka:それだけです、男!すごい!私の場合、すべてのブラウザとiOSで確認できる限り、次のコードが機能しました。$(window).on( 'beforeunload pagehide'、function(){//ページで実行する必要がある作業変化する } ); これは私の目に受け入れられた答えであるはずです。
garavani 2016

18

この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!
    ...
} );

1
イベントをキャッチできますが、確認プロンプトをポップアップするにはどうすればよいですか?使い方return 'test';... OPでたものと同様に動作していない
user2335065

おかげで私は元の質問でそれを逃しました。iOSでこれを具体的にテストしていませんが、この行を追加すると機能する可能性があります。window.event.cancelBubble= true; 私の答えに追加します
危険

2
おかげで、残念ながら機能しません...その中にalert()を入れようとしましたが、alert()が発生する前に新しいページが読み込まれ始めたようです。:また、この参照stackoverflow.com/questions/3239834/...
user2335065

@ user2335065同じ解決策を見つけましたか?
Neeraj Rathod 2017

みんな、ページを離れる前に確認プロンプトを表示するための解決策を見つけましたか?これは、IOSサファリを除くすべてのブラウザで正常に機能します。ページ非表示イベントも試しましたが、うまくいきませんでした。前もって感謝します。
ラフル

6

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


55
または、誤って間違ったものをタップしたからといって変更が失われないように、変更を自動的に保存します。
Joel Mueller

4
有効な用途がないとは言いませんでしたが、最も頻繁に使用されたと言っただけです。
Charles Boyung 2010

3
@JoelMuellerあなたのコメントは受け入れられた答えでなければなりません:)
sanchez

1
@JoelMuellerそれはまさに私のユースケースです。Grrr @ apple
user2808054 2016

@JoelMuellerは、モバイルサファリが変更を自動的に保存するというこの声明に対処できる公式ドキュメントを共有していただけますか。
Neeraj Rathod 2017



2

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

聞くを参照してください。

ページ却下イベント(アンロード前、アンロード、ページ非表示)中にアラートが許可されなくなりました。

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


1

ページが残っているかどうかを知る必要がある場合は、を使用できますdocument.unload。iOSブラウザでは正常に動作します。Appleのドキュメントを見ると、非推奨であることがわかり、document.pagehideの使用を推奨しています。


はい、このイベントはサファリで発生しますが、Chromeのように確認プロンプトが表示されません。
ラフル

1

最新のすべてのブラウザで機能するソリューションは次のとおりです。

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、ドキュメントのアンロード時に呼び出されないバグが含まれています。参照:ここ

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

NB

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

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