0

キーボードの「N」キーと「P」キーが押されたときに、次/前へのスクロールを開始するこのスクリプトがあります。私の質問は、ユーザーがこれらの文字を任意のフォーム (検索フィールド、ログイン フィールドなど) で通常どおり入力したときに、これが起動しないようにする方法です。スクロール機能を起動します。その動作を修正するにはどうすればよいですか?

私のコードは以下の通りです:

$(document).keydown(function (evt) {
    if (evt.keyCode == 78) {
        evt.preventDefault();
        scrollToNew();
    } else if (evt.keyCode == 80) {
        evt.preventDefault();
        scrollToLast();
    }
});

ありがとうございました。

4

3 に答える 3

8

イベント オブジェクトにはtarget、イベントが実際に発生した場所を示すプロパティがあります (その後、ドキュメント レベルのハンドラーにバブルアップしました)。したがってevt.target、フォーム フィールド要素に対してテストを行うことができ、一致する場合は特別なロジックを実行しません。

おそらく、これを行う最も簡単な方法は、を使用することですclosest。たとえば、次のようになります。

$(document).keydown(function (evt) {
    if (!$(evt.target).closest('input, select, textarea')[0]) {
        if (evt.keyCode == 78) {
            evt.preventDefault();
            scrollToNew();
        } else if (evt.keyCode == 80) {
            evt.preventDefault();
            scrollToLast();
        }
    }
});

そこで私は、最も近いフォームフィールドが要素で始まり (closest与えられた要素で始まるため)、祖先を調べています。そうでない場合、返される jQuery オブジェクトは空になり、[0]が返されundefinedます。isで!undefinedあるため、フォーム フィールドにないtrueときにロジックを処理します。

于 2012-05-25T13:24:20.753 に答える
0

私は何かのようなものだと思います

$('form').on('keydown', function(event) {event.stopPropagation();});

フォーム内からのキーボードコントロールが必要ない場合は、このトリックを実行する必要があります。

于 2012-05-25T13:27:09.613 に答える
0

ソース DOM ノードを指すobjecttargetのプロパティを使用します。だから、あなたは簡単に使うことができますEvent

var nn = evt.target.nodeName.toLowerCase();
if (nn != "input" && nn != "textarea")
    // do your special handling

ただし、要素の所有者フォームを指すformプロパティの存在を確認する方が簡単な場合があります。

if (! "form" in evt.target)
    // do your special handling
于 2012-05-25T13:35:00.390 に答える