2011-07-17 5 views
10

フォーカスイベントの原因を特定する必要があります。トリガされたフォーカスイベントを特定しますか?

理想的には、クリック、タブ/キーボード入力、マニュアル(コード経由)トリガーを区別したいと思います。

どうすればいいですか?

私はイベントオブジェクトを見ていますが、役に立たないものは見ていません。

if(ev.hasOwnProperty('originalEvent')) { 
    // Focus event was manually triggered. 
} 

は、キーボードとマウスベースのフォーカスイベントを区別するために、:フォーカスが$x.focus()呼び出しから来ているのであれば、ブラウザからのイベントがなかったので、

+0

'mouseover'イベント(または 'クリック')をバインドし、発生した場合はマウスのフラグを設定し、フォーカスイベントでチェックしてください。 – spacevillain

+0

@spacevillain:コードでもトリガーできませんか? – PeeHaa

+0

'mouseover'とそれに続く 'click'はどうですか?マウスの座標が右の範囲にあるかどうかを確認することができます。醜いですが、うまくいくはずです。これは何のために必要なのですか? :-) – spacevillain

答えて

8

は、そのイベントはoriginalEvent性質を持っていません。​​ハンドラーを他のすべてにバインドしてタブまたはShift-Tabを検出することができますが、それはグロスハックであり、おそらく信頼できません。たとえば、iPadの場合、のタブを押して次のフィールドに移動すると、と表示されます。またはの前に表示されます。ポップアップキーボードのに移動してキープレスとして登録されないことがあります。

関心にもあるかもしれない同様の問題についてclickのイベントがあります:あなたがコメントで注意したよう

In jQuery, how can I tell between a programmatic and user click?

、あなたがトラップclickイベントは、マウスベースの検出することができは、フォーカスを変更し、覚えておくためにどこかにフラグを設定します。何originalEventはjQueryのイベントに存在しない場合、フォーカスの変更を手動で(すなわち$x.focus()または類似の)トリガーされた

  1. :次に、あなたはこれを持っていると思います。
  2. クリックハンドラフラグが設定されている場合、フォーカスの変更はマウス操作から発生します。
  3. それ以外の場合、フォーカスの変更はキーボードイベントから発生します。

クリックイベントとフォーカスイベントが正しい順序で行われるように注意する必要があります。完了したら、フラグがクリアされていることを確認する必要があります。これは弾丸ではないかもしれないが、そうである必要はないかもしれない。

+0

私は 'を使用できます。マウスのクリックを検出するための 'click'ハンドラ、そしてこの' originalEvent'オブジェクトを持つ '.focus'ハンドラがキーボードイベントとトリガイベントを区別します。うまくいっているようだ。ありがとう! – mpen

+0

@マーク:キーボードのイベントを検出しようとするよりも、おそらく 'クリックするといいでしょう。それで 'originalEvent'は手動で起動されたことを意味しません。クリックはマウスによって引き起こされたことを意味します。それ以外の場合はキーボードからのものです。私は将来の参照のためにこれを私の答えに加えます。 –

+0

いくつかのブラウザでは、少なくとも最近のChromeでは 'click'イベントが' focus'イベントの後に発生します。しかし、 'mousedown'イベントは確実に' focus'の前に確実に発生するので、フォーカスの原因を検出するためにトラップすることができます。 – DSimon

関連する問題