2013-05-22 14 views
5

キーボードのショートカットで何かをビルドしています。 Ctrl + mを押してメニューを開きます。私はそのためのjQueryとjwertyプラグインを使用し、これは次のコードのようになります。「M」キーをタップする入力にフォーカスがあるかどうかをテストします。

jwerty.key('m', function() { 
    toggleMenu(); 
}); 

はtoggleMenu機能をトリガします。

これで、ユーザーが入力フィールドまたはテキストエリアに入力しているときに、この関数がトリガーされないようにする方法が不思議でした。

+0

を私は[ドキュメント](HTTPSでこれを見つけました。 com/keithamus/jwerty)をGitで実行します。あなたがセレクタにバインドしていてコンテキストを必要としない場合は、 'jwerty.key( '^ +⇧+ P /⌘+⇧+ P'、function(){[...] }、 'input.email'、 '#myForm'); '_試してみてください。 –

+0

function toggleMenu(){alert( 'ok');} jwerty.key( 'm'、toggleMenu、 "body:not(input)");これは動作するはずですが、入力時にも起動します。 – dt192

答えて

5

私はjwertyを使用したことがありませんが、私はお勧めしたい:

jwerty.key('m', function (e) { 
    if (e.target.tagName.toLowerCase() !== 'input') { 
     toggleMenu(); 
    } 
}); 

これは、イベントのターゲットをテストし、そして、それはないinputだ場合、toggleMenu()関数を呼び出します。 の場合はinputですが、何もしません(ご希望の場合は明示的にreturn falseとなります)。私は実際に行っている必要があり、上記のように、textareaを説明するために

if評価に別の句を追加する(拡張することができ、あるいは以下、switchベースのアプローチをとることができます。

jwerty.key('m', function (e) { 
    switch (e.target.tagName.toLowerCase()) { 
     case 'input': 
     case 'textarea': 
      break; 
     default: 
      toggleMenu(); 
      break; 
    } 
}); 

ターゲット要素がmを押すと、どちらかinputまたはtextareaある場合ないこれら二つの要素のいずれかの場合、デフォルトの状態に入るとtoggleMenu()が呼ばれるのに対し、何もしません。

+0

'textarea'を忘れないでください。 – Prinzhorn

+0

@Prinzhorn:あなたは良い点があります。 *更新されました。* –

+1

「m」で始まり、「m」で始まる項目に行くことができるので、これに基づいて私の新しいコードでselectを説明しました。 'モナコ'。ありがとう! – Wolfr

0

event.stopPropagation()(またはjQueryを使用する場合はreturn false)を呼び出す入力とテキストエリアに、別のイベントハンドラを追加する方法もあります。こうすることで、イベントハンドラが最初にトリガされ、イベントが既存のハンドラに「伝播」しないようにします。

もう1つの方法は、既存のハンドラ内のイベントを入力/テキストエリアから取得したかどうかをチェックすることです(このアプローチをとる場合は他の回答を参照してください。 activeElementは古いブラウザではサポートされていないため、Davidの答えを使用したいと考えています:Which browsers support document.activeElement?)。

は商品にフォーカスしているかどうかをテストするためにjQueryの(と一部のブラウザ)が提供する :focusセレクタと is機能を使用することができます
+0

IE4より古い? [mdn](https://developer.mozilla.org/en-US/docs/Web/API/document。アクティブな要素) – Andreas

+0

私は "古い"を "本当に"古いものに変更する答えを編集しました – machineghost

0

:// githubの:

$(".my-thing").is(':focus') 
+0

これは反対です、何もフォーカスがないかどうかチェックしたい – Wolfr

+0

$( ":focus")。length == 0 – Crisfole

+0

ややこしいトピックをオフにしますが、これはPhantomJSでは機能しないようです – Mansiemans