使用没有插件的 jQuery 输入相等检查

Posted

技术标签:

【中文标题】使用没有插件的 jQuery 输入相等检查【英文标题】:Inputs equality check using jQuery without plugins 【发布时间】:2018-04-11 07:55:09 【问题描述】:

我尝试创建一个函数来检查两个电子邮件字段之间的匹配,比如说 EMAIL 和 CONFIRM 电子邮件。我绝对尽量避免使用 jQuery 验证。对于一个单一的领域来说是不值得的。对于其余部分,我使用 html5 属性,如 required、pattern 等,并且效果很好。这就是我想通过 setCustomValidity 提供无缝体验的原因。

这是我的工作代码,当然,有更多 JS 和 jQuery 经验的人可以改进它。

HTML

<input type="email" name="addr1" id="addr1" required>
<input type="email" name="addr2" data-equal-to="addr1" data-msg-error="Emails do not match." required>

jQuery

$('[data-equal-to]').on('blur', function() 
    var to_confirm = $(this),
        to_equal = $('#' + to_confirm.data('equal-to'));
    if (to_confirm.val() != to_equal.val()) 
        this.setCustomValidity(to_confirm.data('msg-error'));
    
    else 
        this.setCustomValidity('');
    
    to_equal.one('blur', function() 
        to_confirm.trigger('blur');
    );
);

以下是我遇到的问题:

    我使用的是“.bind”。事实证明它已被弃用。然后我开始使用 '.on' 我忘记了最后 3 行。没有事件监听器 第一个电子邮件输入,所以我只检查 CONFIRM 输入。这 已修复。 我使用的是“输入”而不是“模糊”。提供“输入” 实时验证(当你输入时)这很好,但也消耗了 在我看来很多。当您仍在输入时,它也显示错误 (并且还没有完成),所以一些用户可能会感到困惑。唯一的 我发现“模糊”的缺点是有效性的反馈是在 您单击另一个元素(取消焦点)。 在每个输入上绑定一个新的侦听器到 'to_equal' 被证明是个坏主意。我最终得到了多个侦听器,导致浏览器崩溃。我发现 '.one' 存在,它应该在 .on 之前(或之后?)与 .off 相同

我的问题是 - 这个小脚本可以在速度方面进行改进,还是使用更少的事件侦听器?有没有我没有想到的案例?我进行了很多搜索以找到一个好的无插件解决方案,但没有运气。此外,我坚持使用 data- 属性来提供匹配的 id + 错误消息(因为网站是多语言的,并且比动态修改 HTML 更容易)。

我认为拥有这个脚本的“完美”版本会帮助很多人,尤其是在确认电子邮件/密码(密码必须注意区分大小写!)方面。

【问题讨论】:

为什么不直接使用 javascript ===== 您向我们提供了您想要改进的工作代码。我觉得这个问题更适合codereview.stackexchange.com/questions/ask。 亲爱的 Wouter Bouwman,您可能是对的。我不知道 CODE REVIEW,因为自从我上次出现以来,SA 社区有了很大的发展。感谢您指出这一点。 【参考方案1】:

尝试 onFocusOut 事件。用户键入验证电子邮件未检查。如果将此输入保留为选项卡或 clic 触发的检查功能。 例如: jsfiddle.net/Qh0stM4N/cf757e82/1/ 我们能够在每次击键时控制它。但是当用户写完就用户而言最好的结果并转到另一个表单元素时,它将被采取。如果在发生更改时检查何时按下按钮不是问题,并且您想验证 HTML5,则可以使用此工具来完成 codepen.io/diegoleme/pen/surIK

【讨论】:

【参考方案2】:

你有没有试过简单地给第二个输入一个 addr2 的 id,然后说

if($("#addr1").val() != $("#addr2").val())

?

【讨论】:

这毫无意义,对不起【参考方案3】:

具有类和兄弟的可重用代码:

$('.mail')              .on('keyup', checkPasses)
function checkPasses (e) 
    $ps1 = $(e.delegateTarget)
    $ps2 = $ps1.siblings('.psw')
    $pss = $ps1.add($ps2)
    if ( $ps1.val() == $ps2.val() ) 
        $pss.css('color', 'green')[0].setCustomValidity('')         
   else       
        $pss.css('color', 'red')[0].setCustomValidity('Passwords do not match')
    

【讨论】:

以上是关于使用没有插件的 jQuery 输入相等检查的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 检查没有滚动条的鼠标滚轮事件

检查插件是不是已在 jQuery 中初始化?

无效时 JQuery 验证插件单选按钮“错误显示”

使用带有“远程”选项的 jQuery 验证插件

简单jQuery相等列插件

调试 jQuery 插件以在两个相等的列中显示动态列表