21

最近、Web アプリケーションの特定のページが閉じられようとしていることをサーバーに通知する緊急の要件がありました。「簡単なピージー」と思いbeforeunloadましたが、かなり長い間利用できます。HTML5 の「もの」は、イベント ハンドラーなどから文字列値を取得するオプションがあり、ユーザーにインターセプトのオプションを与えるという形で、仕様を更新しました(それは私が考えたことでした...) 。returnbeforeunload

についての MDN ページを参照してください。onbeforeunload

しかし、結局のところ、この日付までの動作を説明する「公式の」仕様はありません。beforeunload私が見つけた唯一の公式文書はWHATWGにあり、もちろんこれは W3C への単なる提案です。

WHATWGを見る

ここまでは順調ですね。イベントハンドラー内で同期された XHR リクエストを作成できます。beforeunload「ほとんどの」ブラウザでは、そのリクエストが完了するまでに約 1 ~ 2 秒の時間枠が与えられ、その後、強制終了されます。標準の非同期リクエストはすぐに強制終了されます。とは言っても、どこから知ったのかも分からず、今見るとゴシップや口コミのようです。それでも、Firefox + Chrome で動作しますが、これに頼ることはできませんね。

WHATWG について進行中の議論/提案はありますbeforeunloadか?
私が見つけられなかったイベントに関する他の公式リソースはありますか?

ここで私にとって最も重要なことは、sync-XHR 経由でデータをどの程度確実に送信できるかということです。

4

3 に答える 3

20

を見てくださいnavigator.sendBeacon()。これにより、ページがアンロードされているときでも、サーバーにデータを確実に送信できます。現在ドラフト仕様であり、Firefox 31、Chrome 39 (37 からのフラグの背後)、Opera 24 のフラグの背後でサポートされています。

次のようなものを使用して、ポリフィルを「ソート」できます。

navigator.sendBeacon = navigator.sendBeacon || function (url, data) {
    var xhr = new XMLHttpRequest();

    // Need to send synchronously to have the best chance of data getting
    // through to the server
    xhr.open('POST', url, false);
    xhr.send(data);
};

参考文献:

于 2013-03-18T14:48:25.843 に答える
4

覚えておくべきことはbeforeunload、InternetExplorerによる拡張機能として開始されたことです。自動的に、それはそれをウェブ上で二流の市民にします。仕様はなく、ブラウザの実装も異なります。たとえば、Firefoxは文字列を表示せず、一般的なメッセージのみを表示することで、部分的にしか実装していません。

さらに、完全に実装されている場合でも、ユーザーがプロセッサを終了した、ブラウザがクラッシュした、コンピュータの電源がオフになっているなど、考えられるすべてのアンロードシナリオから保護するわけではありません。これらの極端なシナリオを無視しても、そのような要求を無視するようにブラウザーを構成できる可能性があると思います。

私の気持ちは、あなたがあなたを救うためにこのメッセージに頼るべきではないということです。このWebアプリが内部にある場合は、タブを閉じるだけでなく、SaveまたはCloseまたはその他のボタンを使用するようにトレーニングすることをお勧めします。外部の場合は、ユーザーが自分のことを行うときに自動保存を検討しますか?

于 2013-03-18T14:40:16.447 に答える
2

同期XHRは、ブラウザー ハングのトップ ソースであり、ハングの約 10% を占めています。-同期モード-unless-you-like-to-hang.aspx

IE では、要求に Windows 認証のラウンドトリップが必要な場合、または送信する POST 本文がある場合、同期 XHR でさえ「中断」される可能性があります。最初の認証されていないリクエストのヘッダーのみが送信されることがあります。

于 2013-03-18T15:44:51.953 に答える