2

私は現在、フォーカス時にキーボードストロークを呼び出しているテキストボックスを持っています:

$myTextBox.on('focus', function(e){
    $(document).keydown(function(e){ 
       if(e.which==13)
         e.preventDefault() 
    });
    $(document).keyup(function(e){
       if(e.which ==13)
         alert("hey");
    });
});

これを複数回クリックすると、「Enter」を1回押すと多くのアラートが発生します。これを回避して、1回だけ呼び出されるようにするにはどうすればよいですか。

4

4 に答える 4

1

フィールドがフォーカスされるたびに、イベント リスナーを追加しています。

ドキュメント準備完了関数にキーダウン、キーアップリスナーを追加するだけです...

$(function() {
    $("#myTextBox").keydown(function(e){ 
       if(e.which==13)
         e.preventDefault() 
    });
    $("#myTextBox").keyup(function(e){
       if(e.which ==13)
         alert("hey");
    });
});​

http://jsfiddle.net/ShHkP/

于 2013-01-02T23:34:40.897 に答える
0

他の人が言ったように、イベントを追加し続ける必要はありませんfocus。同様に、イベントをテキストボックス自体に添付する必要があります。これは、イベントをフォーカスに追加するときに実際にやろうとしていることだからです。

$myTextBox.on({
  'keydown': keyDown,
  'keyup': keyUp
});​

アプリケーションが enter-alert-ok ループに入らないようにするには、呼び出しの前にキーアップ リスナーをオフにし、OK を押したalert()後にオンに戻す必要があります。

これがフィドルです。

于 2013-01-03T00:38:33.880 に答える
-1
var alreadyPressed = false;
    $("textarea").keypress(function (e) {
        if (e.which == 13) {
            e.preventDefault();
            alreadyPressed = true
        }
    });
    $("textarea").keyup(function (e) {
        if (e.which == 13 && !alreadyPressed) {
            alert("hey");
            alreadyPressed = false;
        }
    });

http://jsfiddle.net/DerekL/Dr6t2/

于 2013-01-02T23:26:02.910 に答える
-1

あなたがやろうとしていることはわかります(またはしない?)。入力がフォーカスされるたびにドキュメントにテキストエリアを追加する代わりに、イベントをフォームに添付してテキストエリアを除外することができます。

$('form').on('keydown', function( e ) {
  // Prevent submit when pressing enter but exclude textareas
  if ( e.which == 13 && e.target.nodeName != 'TEXTAREA' ) {
    e.preventDefault();
  }
}
于 2013-01-02T23:28:49.597 に答える