1

この質問はおそらく以前に尋ねられたことがありますが、ここでもインターチューブでも、それを見つけるのに適した検索フレーズを見つけることができません.

キーボードを使用するゲームの Web ページがあるため、jQuery を使用してドキュメントにハンドラーを設定しました。

$(document).keydown(myKeydown);
$(document).keyup(myKeyup);
$(document).blur(myBlur);

しかし今では、入力フィールドに書かれたテキストはすべてドキュメント イベント ハンドラによって盗まれ、文字はドキュメント ハンドラで使用されていない場合にのみ入力に到達します。これらのハンドラーは、本質的に次のようになります。

function myKeydown(event)
{
    if (event.which == 65)
    {
        console.log('a pressed');
        return false;
    }
    return true;
}

ここで、テキスト入力ボックスがあるとします。「a」以外のキーを押すと、入力に表示されますが、「a」は表示されません(myKeydownがfalseを返すことで「食べている」ため)。いずれの場合でも true を返すことができますが、入力ボックスがフォーカスされていない場合、「入力時に検索」などの奇妙なことが有効になっていると表示されます。

入力ボックスのハンドラを追加しようとしました:

input.keydown(function() { console.log('down'); return false; });
input.keyup(function() { console.log('up'); return false; });
input.blur(function() { console.log('blur'); return false; });

このコードでは、console.logs を取得しますが、もちろんキーはボックスに到達しません (プレスで何もしていないため)。これらのイベントをどこかに送信して、対応するキーが入力ボックスに表示されるようにすることはできますか?

注:一部の人々は、event.stopPropagation()の代わりに使用することを提案していますreturn falsejQueryのドキュメントには次のように書かれています:

ハンドラーから false を返すことは、イベント オブジェクトで .preventDefault() と .stopPropagation() の両方を呼び出すことと同じです。"

それがまさに私が望んでいることです。「入力しながら検索」が開始されないようにするには、入力を入力してページで「入力しながら検索」するというデフォルトのアクションを防止する必要があります。

(また、何らかの理由でkeydownイベント ハンドラーに Firefox 最新の stopPropagation() 関数がありません。)

4

2 に答える 2

2

adeneo のコメントをきれいにするには:

function myKeydown(event)
{
    if (event.which == 65)
    {
        console.log('a pressed');
        event.stopPropagation();
    }
}
$(document).keydown(myKeydown);

サンプル

于 2012-12-14T01:06:33.493 に答える
1

これを防ぐ方法は2つ。

  1. イベントハンドラーでターゲットを取得し、ターゲットがinput/の場合はコードを無視しますtextarea

  2. 同じイベントを入力にバインドし、伝播を停止します

最初のオプションは正しいことです、IMO。試す:

if ($(event.target).is('input, textarea, select'))
{
    return true;
}

イベント ハンドラの開始時。

于 2012-12-14T00:16:41.613 に答える