web-dev-qa-db-ja.com

window.onbeforeunloadはiPadで動作しませんか?

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

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

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

誰が何が起こっているのか知っていますか?どんな入力でも大歓迎です。

ありがとう

76
Art Zambrano

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

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

19
Danny Armstrong

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

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

4
Charles Boyung

beforeunloadイベントは、Mobile Safariではサポートされていません。ここでサポートされているすべてのイベントのリストを見ることができます: イベントの処理Apple documentation

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

3
Julien Bachmann

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

関連Chromeバグレポート

3
Joel Mueller

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

聞こえます.

ページ破棄イベント(アンロード、アンロード、ページ非表示の前)中のアラートは許可されなくなりました。

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

2
zelda.j

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

1
Miquel

以下は、最新のすべてのブラウザーで機能するソリューションです。

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を使用しました。

0
Dan Bray