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");
    });
});

如果我多次单击它,按一次“输入”会导致许多警报,我该如何避免这种情况,以便只调用一次。

4

4 回答 4

1

每次字段获得焦点时,您都​​会添加事件侦听器。

只需在文档就绪功能上添加 keydown、keyup 侦听器...

$(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 循环,您必须在alert()调用之前关闭 keyup 侦听器,然后在点击 ok 后将其重新打开。

这是一个小提琴。

于 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 回答