避免使用.focus中的多个事件侦听器

时间:2013-01-02 23:23:40

标签: javascript jquery

我目前有一个文本框,我在焦点上调用键盘笔划:

$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 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

与其他人一样,您不必继续在focus添加活动。同样,您应该将事件附加到文本框本身,因为这实际上是您在焦点上添加事件时尝试执行的操作。

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

为了使您的应用程序不进入enter-alert-ok循环,您必须在alert()调用之前关闭keyup侦听器,然后在按下ok之后将其重新打开。

Here's a fiddle.

答案 2 :(得分:-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/

答案 3 :(得分:-1)

我看到你想做什么(或不是?)。您可以将事件附加到表单并排除textarea,而不是每次输入聚焦时将其添加到文档中。

$('form').on('keydown', function( e ) {
  // Prevent submit when pressing enter but exclude textareas
  if ( e.which == 13 && e.target.nodeName != 'TEXTAREA' ) {
    e.preventDefault();
  }
}