【问题标题】:Does 'keypress' jQuery event fire before an inputs value is updated?'keypress' jQuery 事件会在输入值更新之前触发吗?
【发布时间】:2017-02-01 21:18:50
【问题描述】:

我在输入字段上有一个按键事件监听器来确认密码。我希望页面上的button 被禁用,直到passwordconfirm-password 字段具有匹配的值。我正在使用.keypress() jQuery 函数,但它似乎总是落后于我预期的一个字符?

这里是代码

$('#confirm').keypress(function() {
    console.log('#confirm').val();
    if($('#password').val() == $('#confirm').val()) {
        $('button').removeProp('disabled');
        console.log("yes");                
    } else {
        console.log("no");
    }
});

但是当我检查元素并查看页面上的控制台窗口时,第一次触发事件时,它会将表单值打印为空白。然后当我输入第二个字符时,它只打印第一个字符,当我输入第三个字符时,它打印前两个字符,依此类推。

例如,如果我将asd 输入password 字段并开始在confirm 字段中输入相同的内容,输出将如下所示:

<blank> no a no as no

所以此时passwordconfirm 字段都有“asd”,但我需要输入一个额外的字符才能被识别,并从按钮中删除“disabled”属性。

我尝试使用.change() 代替.keypress(),但直到input 字段失去焦点时才会触发,这不是我想要的。

【问题讨论】:

  • 您可以尝试使用keyup 事件,它应该在用户释放键后触发 - api.jquery.com/keyup
  • 除了禁用按钮之外,请确保包含其他不匹配的指示 - 这真的会让我作为用户感到沮丧
  • 使用input事件;这就是它的用途,它适用于鼠标粘贴、IME 等
  • @JamesThorpe 还有其他的视觉提示,我同意这种挫败感哈哈

标签: javascript jquery


【解决方案1】:

我希望在密码和确认密码字段具有匹配值之前禁用页面上的按钮

如果这是您的目标,您可以将事件侦听器添加到调用验证函数的两个输入中:

$('#password').on("input", function() { validatePassword(); });

$('#confirm').on("input", function() { validatePassword(); });

function validatePassword() {
    if($('#password').val() && $('#confirm').val() && $('#password').val() == $('#confirm').val()) {
        $('button').prop('disabled', false);
    } else {
        $('button').prop('disabled', true);
    }
}

向按钮添加 ID 也是值得的。使用“按钮”将启用/禁用页面上的所有元素。

示例:https://jsfiddle.net/doL4t9vv/1/

【讨论】:

  • 页面上只有一个按钮,所以禁用所有按钮不是问题。
  • 哥奇亚。那么我所回答的应该可以正常工作。如果您有任何问题,请告诉我。
  • 前两行可以很容易地合并到$('#confirm, #password').on('input', validatePassword)
  • 我同意它们可以这样组合。但是,如果您想专门为一个输入添加额外的逻辑,或者调用多个函数怎么办?例如,如果您正在验证用户名,则可以调用一个函数来检查可用性(异步),并调用另一个函数来检查有效字符。
【解决方案2】:

几个月前我遇到了同样的问题。
尝试使用 Jquery 中的 keyup 函数。

Keypress 事件在您按下键时触发,因此输入尚未填充。
释放键时触发 Keyup 事件。

【讨论】:

    【解决方案3】:

    可以使用input 事件并将其简化为

    var $passwords =$('#confirm, #password').on('input', function() {
        var thisValue = this.value.trim();
        // does this input have value and does it match other
        var isValid = thisValue  && thisValue  === $passwords.not(this).val().trim();
        // boolean used for disabled property    
        $('button').prop('disabled', !isValid);      
    });
    

    【讨论】:

    • 我想我更喜欢额外的代码行以增加易读性;)哈哈
    • 为什么要修整值?如果有人在第一个字段中有空格但在第二个字段中没有空格怎么办?例如。密码=“test123”和确认=“test123”。他们是不平等的,不应该被那样对待。 :)
    • 已修复...同时修剪了它们
    • 我是说你根本不应该修剪。
    • "password123" 和 "password123 " 会启用按钮,但它不应该。特别是如果他们希望密码末尾有空格。
    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2016-09-21
    相关资源
    最近更新 更多