2012-05-18 5 views
11

私が今注目しているフォーカスイベントには少し問題があります。どうやら、別のブラウザのタブに切り替えてからもう一度戻ると、フォーカスが合ってしまいます。私はむしろそれが起こることはないだろう。出来ますか?ブラウザのタブを変更すると、特にGoogle Chromeのフォーカスイベントが発生することがあります。

私は今日までこれを知らなかった。 http://jsfiddle.net/MJ6qb/1/

var times = 0; 
$('input').on('focus', function() { 
    times ++; 
    $(this).after('<br>Focused '+times+' times'); 
}); 

再現するには:入力にフォーカスをし、ブラウザのタブを切り替える、その後、スイッチバックここで少しデモです。 Google Chrome 19が2度発砲しています!すべてのブラウザは、タブに戻ったときにフォーカスイベントを発生させるようです。

ブラウザのタブを切り替えるときに機能が実行されるのは、ユーザーのクリックやタブの場合にのみ実行するのが理想的ですが、Chromeの問題を認識しています。私の実際のアプリで余計な不要なバックツーバックAJAXリクエスト(これは最新である必要があるオートコンプリートの結果を取得するためのものですが、キーアップイベントを使用したいとは思っていません)。

jQuery関連(私はvanilla javascriptでテストしました)と思われませんが、解決策としてjQueryを使用できます。私はこれについて何かできることはありますか?私はjQueryのone()を使うことができると知っていますが、関数を複数回実行したいと思います。

+1

少し無関係を試してみてください、しかし、あなたが時を検出することができるかもしれませんブラウザのタブにフォーカスが当たっているかぼやけている[this](http://stackoverflow.com/a/6184276/1028949)のようなデフォルトの動作を無効にします。 Chromeの二重火災は、私が知ることのできる[既知のバグ](http://code.google.com/p/chromium/issues/detail?id=124583)です。 – Quantastical

+0

ああ、ありがとう、それは知られているバグであったことを認識していない、ちょうどそれがFFのものではないことを確認するために投稿する前に、Chromeでコードをテストして見つけた(私が開発した)。私は諦めて「乗る」と感じていますが、本当に面倒です。私はその答えのコードで何かできるかどうかを見ていきます。 –

+1

発生している動作が必要です。タブを離れると、そのテキストボックスのフォーカスが外れていて、戻ってきたらもう一度フォーカスしています。別のアプリケーションに退出する場合も同じです。残念ながら、私はこれを上書きする方法を考えることはできません。 – Quantastical

答えて

5

this

var times = 0; 
var prevActiveElement; 

    $(window).on("blur", function(e){ 
      prevActiveElement = document.activeElement; 
    }); 

    $('input').on('focus', function() { 
     if (document.activeElement === prevActiveElement) { 
      return; 
     } 
     prevActiveElement = document.activeElement; 
     times++; 
     $(this).after('<br>Focused ' + times + ' times'); 
    }).on("blur", function(){ 
     prevActiveElement = null; 
    });​ 
+0

この作品のように見えます!回避策をありがとう!また、 'activeElement'については決して知らなかったので、その情報の二重の感謝。 –

+0

ちなみに、これは複数の入力でも完璧に動作しています。http://jsfiddle.net/MJ6qb/5/(興味がある場合は、コンソールを開いてリクエストを確認してください)。 –

+0

@WesleyMurch '$(" body ")。on(" blur ")'は全くトリガされません。 'blur 'はバブルしないので、おそらく$(" body ")。on(" focusout "、" [data-autocomplete] "、fn)'が必要です。 ( "focusin"、 "[data-autocomplete]"、fn) ' – Esailija

3

問題を回避するために、これを試してみてください:

var times = 0, foc=true; 

$(window).on('focus', function() { 
    foc = false; 
    setTimeout(function() {foc=true}, 200); 
}); 

$('input').on('focus', function() { 
    if (foc || times===0) { 
     times ++; 
     $(this).after('<br>Focused '+times+' times'); 
    } 
}); 

FIDDLE

+0

これまでのところ、TABのような別の方法(または別の入力を最初にクリック)でフォーカスを当てない限り、クリックでは発火しません。しかし、はい、興味深い解決策! –

+0

これは奇妙なことですが、ここではChromeでうまく動作しているように見えますが、フォーカスイベントは毎回発生しますが、ブラウザのタブの変更は発生しません。 – adeneo

+0

他のことをする前に入力をクリックするだけではうまくいかないようです。あなたはそれを試しましたか? –