2011-02-28 8 views
3

問題は、チャットのようなプログラムを作っています。ユーザーがウィンドウを離れたかどうかを知る必要があります。また、別のウィンドウやタブに変更して他のユーザーに他のユーザーが今すぐページを見ていないことを確認します。

私はウィンドウイベントのフォーカスアウトが私の問題を解決すると思っていましたが、いくつか問題があります。 最初: ユーザーがウィンドウを離れるときにのみ起動し、入力フィールドにフォーカスしてページ内の他の場所をクリックすると、イベントが発生します。明らかにそれは耐え難いことです。 私はFirefoxでそれを回避しました。 Firefoxでは、そのようなことが起こると、ブラウザはfocusoutイベントを1回発生させます。しかし、本当にウィンドウを離れると、2回発射されます。だから、少しプログラミングが魔法を作りました。

次に、第2の問題が発生しました。 Chrome、他のブラウザが同じように動作する可能性がありますが、あなたが何をするにしても、一度focusoutイベントを発生させるだけです。ウィンドウを離れて、入力からページにフォーカスを移動することは同じです。したがって、私のプログラミングはそこでは機能しませんでした。

希望の動作をシミュレートする方法を知っている人はいますか?または、ChromeなどのブラウザをFirefoxなどのように動作させる方法ですか?

ありがとうございました!

+0

あなたがしたいことは、今日のブラウザでは実際には可能ではないと思います。 – Pointy

+0

'$(document).bind(" mouseleave "、function(){...})'を試しましたか? – Mottie

+0

@Pointy 'window.onblur'ハンドラはうまく動作します。ブラーイベントは、ユーザーが別のタブに切り替えるたびにウィンドウオブジェクトで発生します。 –

答えて

7

使用blurの使用についての協議:

$(window).blur(function() { 
    // code 
}); 

違いはfocusoutは、DOMツリーをバブルアップし、blurがないということです。ウィンドウオブジェクトにfocusoutを設定すると、ページ要素に発生するすべてのブラーイベントも、そのハンドラをトリガします。これは不要なものです。

違いは、focusout(ウィンドウオブジェクトに設定されている場合)は、ページ上で(すべての要素で)発生するすべてのブラーイベントをキャプチャします。対照的に、blur(ウィンドウオブジェクトに設定されている場合)は、それらのブラーイベントをキャプチャしません。

ライブデモ:私は質問に答えるhttp://jsfiddle.net/simevidas/taRG6/

+0

ありがとう!それは本当に私の問題を解決しました! –

+0

私は、jQueryが既にFirefoxとChromeのためのぼかしを使用していると思っていました。 –

+0

@Urielのフォーカスアウトとブラーは、2つの異なるイベントタイプです(どちらも[DOM 3 Events spec](http://www.w3.org/TR/DOM-Level-3-Events/)で定義されています)。 jQueryはそれらを一緒に混ぜ合わせません。 –

0

は、 このソリューションは、私は二回イベントをキャッチする以外は完璧に動作します。私は別のアプリケーションに切り替えたときに、私は別のブラウワー]タブをクリックするか、とき

BLUR ウィンドウイベントにのみ起動されます。