如何捕获“模糊”或“按键”在javascript jquery中输入13 - 或者不是,两者都是

时间:2016-12-02 15:28:35

标签: javascript jquery bind

我想在表单字段中捕获“enter”和“blur”。如果我点击“输入”和“标签”,它也会触发模糊事件......只有一个触发器,所以“或”不是“和”。

$('#login-input-password').bind('blur keypress', function(e){
         if (e.type == 'blur' || e.keyCode == 13) {
            // do something only once, not twice
            // e.g., if I hit "[enter"] and tab to blur, I don't want it to call twice...
         }
    });

答案接受实施

功能用法

function bindTriggerEnterOrBlur(selector,myFunction)
    {
    $(selector).bind('blur keypress', function(e){
        if (e.type == 'blur' || e.keyCode == 13) {
            if (!$(selector).data('has-triggered')) {
                    $(selector).data('has-triggered', true);
                 // do something only once, not twice
                 myFunction();
                // e.g., if I hit "[enter"] and tab to blur, I don't want it to call twice...
                }
             }
        });

    $(selector).bind('focus', function(e){
            $(selector).data('has-triggered', false);
            $(selector).select();   
        });
    }

致电功能

bindTriggerEnterOrBlur('#login-input-email',submitLoginEmail);

其中submitLoginEmail是为触发器执行某些操作的函数,例如,

function submitLoginEmail()
    {
    // submit on enter...
    var email = $("#login-input-email").val();
    if(validEmail(email))   
        {  
        submitNextLogin(); 
        }
    }

3 个答案:

答案 0 :(得分:1)

如果我的要求正确,你只需执行一次回调,但目前它已被执行两次。

如果是这种情况,那么你需要一些方法来表明是否已经调用了回调。

一种方法是使用数据属性

$('#login-input-password').bind('blur keypress', function(e){
     if (e.type == 'blur' || e.keyCode == 13) {
        if (!$(this).data('done') {
            $(this).data('done', true);
         // do something only once, not twice
        // e.g., if I hit "[enter"] and tab to blur, I don't want it to call twice...
        }
     }
});

您还需要另一个事件处理程序来重置元素的done属性

$('#login-input-password').bind('focus', function(e) {
    $(this).data('done', false);
});

答案 1 :(得分:0)

你正在做一个OR。你想要一个XOR(异或),必须使用比较组合来完成。

if (( (e.type == 'blur') && !(e.keyCode == 13)) || 
    (!(e.type == 'blur') &&  (e.keyCode == 13))) {
  // do something only once, not twice
  // e.g., if I hit "[enter"] and tab to blur, I don't want it to call twice...
}

您希望阻止脚本再次触发,因此您需要进行更多状态比较,以确保您的异步事件处理程序知道blurkeypress事件已发生且确保处理程序不会运行两次。

答案 2 :(得分:0)

您还可以执行以下操作:

var doo = function(e){ console.log("do..."); }

$('#wmd-input').bind('blur', doo);
$('#wmd-input').bind('keypress focus', function(e) {
      $('#wmd-input').off('blur');
    if (e.keyCode == 13) {
        doo(e);
    } else
        $('#wmd-input').bind('blur', doo);
});

当焦点发生时它会再次绑定。