48

私はこれを持っています…</p>

$(document).keypress(function(e) {
        if ( e.keyCode === 119 ) // w
            doSomething();
    });

ドキュメントで「w」を押すと、doSomething()関数が起動します。inputフィールドまたはに現在入力中 (フォーカス中) に起動しないようにするにはどうすればよいtextareaですか?

4

4 に答える 4

86

このように、セレクタではなく、イベントの後に要素を除外する必要があります。

$(document).on('keypress', function(e) {
    var tag = e.target.tagName.toLowerCase();
    if ( e.which === 119 && tag != 'input' && tag != 'textarea') 
        doSomething();
});

これは、イベントの発生元の要素である のタグ名をチェックしevent.target、イベントが入力またはテキストエリアから発生していない場合にのみ関数を起動します。

于 2012-08-04T10:41:10.250 に答える
13

イベント ハンドラーが にバインドされている場合document、イベントはすでに入力要素で発生し、html 要素にバブルアップされているため、ハンドラー自体のコード内で除外を処理する必要があります。もう 1 つの方法は、イベントがバブリングするのを防ぐ入力要素の 2 番目のハンドラーを明確にバインドすることですが、それはおそらく正しいアプローチではありません。

コードのデモ

$(function() {
    $(document).keypress(function(e) {
        if ($(e.target).is('input, textarea')) {
            return;   
        }
        if (e.which === 119) doSomething();
    });
});​

ps jQueryイベントオブジェクトのドキュメントを見て、それが公開するプロパティを確認できます。

于 2012-08-04T11:10:54.353 に答える
6

jQuery では、e.whichは正規化されたプロパティであり、 ではありませんe.keyCode

入力していないかどうかを確認するには、次を確認できますdocument.activeElement

$(document).keypress(function(e) {
    if (e.which === 119 && !$(document.activeElement).is(":input,[contenteditable]")) {
        doSomething();
    }
});

デモ。http://jsfiddle.net/pxCS2/1/

于 2012-08-04T11:26:33.697 に答える
2

最も簡単で完璧な解決策は次のとおりです。

$(document).keypress(function(e) {
    if (e.which == 119 && !$(':focus').length) {
        doSomething();
    }
});
于 2013-03-14T13:04:49.840 に答える