私はこれを持っています...
_$(document).keypress(function(e) {
if ( e.keyCode === 119 ) // w
doSomething();
});
_
ドキュメントで「w」を押すと、doSomething()
関数が起動します。現在input
フィールドまたはtextarea
に(フォーカスを合わせて)入力しているときに起動しないようにするにはどうすればよいですか?
このように、セレクターではなく、イベントの後の要素をフィルターで除外する必要があります
$(document).on('keypress', function(e) {
var tag = e.target.tagName.toLowerCase();
if ( e.which === 119 && tag != 'input' && tag != 'textarea')
doSomething();
});
これは、event.target
のタグ名、イベントの発生元の要素をチェックし、イベントが入力またはテキストエリアから発生しなかった場合にのみ関数を起動します。
イベントハンドラーがdocument
にバインドされている場合、イベントは既にinput要素で発生し、html要素にバブルされているため、ハンドラー自体のコード内で除外を処理する必要があります。別の方法は、イベントがバブリングするのを防ぐ入力要素の2番目のハンドラーを具体的にバインドすることですが、これはおそらく正しいアプローチではありません。
$(function() {
$(document).keypress(function(e) {
if ($(e.target).is('input, textarea')) {
return;
}
if (e.which === 119) doSomething();
});
});
追伸 jQueryイベントオブジェクトのドキュメント を参照して、公開されるプロパティを確認してください。
JQueryでは、e.which
はe.keyCode
ではなく、正規化されたプロパティです。
入力していないかどうかを確認するには、document.activeElement
を確認します。
$(document).keypress(function(e) {
if (e.which === 119 && !$(document.activeElement).is(":input,[contenteditable]")) {
doSomething();
}
});
最も簡単で完璧なソリューションは次のとおりです。
$(document).keypress(function(e) {
if (e.which == 119 && !$(':focus').length) {
doSomething();
}
});