Jquery应该只触发一个事件

时间:2016-12-27 09:38:50

标签: jquery

我已经为Enter按钮单击编写了两个脚本,另一个用于更改,但是两个事件都在触发,我想如果输入按钮被keyup / keydown / keypress / paste点击,那么更改不应该在keyup / keydown /上触发按键/粘贴只应触发一个事件。

$('#txtName').on('keypress keyup paste', function (e) {
    var keyCode = e.keyCode || e.which;
    if (keyCode === 13) {
        AddName($('#txtName').val());
    }
});  

$('#txtName').on({   
   change: function () { AddName($('#txtName').val()); }
});

3 个答案:

答案 0 :(得分:1)

因为您正在使用带有键侦听器的两个事件。只需使用其中一个keypresskeyup事件。

添加event.preventDefault();以停止事件,它不会触发change事件。

$('#txtName').on('keyup paste', function (e) {
    var keyCode = e.keyCode || e.which;
    if (keyCode === 13) {
        e.preventDefault();
        AddName($('#txtName').val(),e);
        
    }
});  

$('#txtName').on({   
   change: function (e) { AddName($('#txtName').val(),e); }
});

function AddName(value,e)
{
  console.log(e.type+ " - "+value);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="txtName">

答案 1 :(得分:1)

如果此处的#txtName是输入框,则change事件将延迟,直到该元素失去焦点,并且如果该值已从之前的状态更改,则会触发该事件。

根据您的要求,您可以合并jquery.on上的所有事件,并在处理程序中添加您的逻辑:

$('#txtName').on('keypress keyup paste change', function (e) {
    var keyCode = e.keyCode || e.which;
    if (e.type == "change") {
      AddName($('#txtName').val());
    }
     else if (keyCode === 13) {
        AddName($('#txtName').val());
    }
});  

function AddName() {
  // Your code here
}

答案 2 :(得分:0)

当用户按下某个键时,

按键事件触发,当用户释放该键时(按下之后),键盘事件就会触发。因此,如果您希望一次触发一个事件,则应使用keypress OR keyup。