5

すべてのブラウザの中で、Operaだけがonunload/onbeforeunloadイベントをサポートしていないようです。(Opera、15年になります!)この問題の解決策は何度も取り上げられています。たとえば、onbeforeunloadサポートの検出

残念ながら、Opera 11.51の時点では("onbeforeunload" in window) == true、ですが、実際のonbeforeunloadイベントは実行されません。

ユーザーがページを離れるときに、私のWebアプリケーションはサーバーにデータを送信する必要があります。私はこれに同期ajaxリクエストを使用しています。Operaの問題をカバーするために、ページのどこかにある「保存」ボタンを使用する必要があるようです。ただし、このボタンで、ブラウザがajaxを介して自動保存できるユーザーを混乱させたくないので、このボタンをOperaにのみ表示したいと思います。

私の唯一の選択肢はブラウザ検出ですか?問題は、Operaにはとにかく他のブラウザに変装するオプションがあるということです。

4

4 に答える 4

3

Opera11.5xに'onbeforeunload' in windowあるあなたの発見を再現することはできません 。trueこれはそれを行うための最良の方法であり、それでも機能するはずです。どこかに定義を残していないと思いますか?

onbeforeunload = function (){ ... }

後で機能検出を行うのと同じスクリプトで?もしそうならalert(window.onbeforeunload)、あなたは何を見ますか?問題のあるページへのリンクを共有できますか?

于 2011-09-26T08:18:15.260 に答える
1

Operaはこれにうんちをねじ込みました。window.opera を探して Opera を検出し、存在する場合は、Opera が処理できないものを拒否します。

unload を使用するのは、ゲームの後半に発生するため、良くないと思います。onbeforeunload だけでうまくいく場合もあります。繰り返しになりますが、window オブジェクトでオペラを探し、存在する場合は、それができないことを否定します。:)

PPK はここでそれについて話します: http://www.quirksmode.org/js/detect.html

于 2011-09-24T18:40:26.873 に答える
0

同様の/重複した質問に対する私の回答を参照してください。基本的には、ドメインの最初のページで検出を設定し、その検出結果を に後続のすべてのページに保存しますlocalStorage。実際のコード例を含みます。

于 2013-08-08T22:38:43.217 に答える
0

この投稿に出くわした人のために、これは onbeforeunload サポートを検出するために使用するコード スニペットです。ブラウザーがサポートしていない場合は、onunload に切り替えます (jquery の使用に注意してください。明らかに必須ではありません)。私の場合、このコード (および少し追加) を使用して、AJAX リクエストがまだアクティブであるかどうかを確認し、ユーザーの移動を停止します。onunload の使用は理想的ではないことに注意してください。ブラウザは引き続きページから移動しますが、少なくとも、データが失われた可能性があり、戻って確認する必要があることをユーザーに警告する機会が得られます。

使用可能なイベントを検出するクロス ブラウザー サポートのために、 https://github.com/kangax/iseventsupportedで利用可能な isEventSupported() 関数を使用していることにお気付きでしょう。

// If the browser supports 'onbeforeunload'
if (isEventSupported('beforeunload', window)) {
  $(window).on('beforeunload', function(){
    return 'This page is still sending or receiving data from our server, if you recently submitted data on this page please wait a little longer before leaving.';
  });
} 
// The browser doesn't support 'onbeforeunload' (Such as Opera), do the next best thing 'onunload'.
else {
  $(window).on('unload', function(){
    alert('This page was still sending or receiving data from our server when you navigated away from it, we would recommend navigating back to the page and ensure your data was submitted.');
  });
}
于 2012-09-16T09:39:48.083 に答える