我正在制作一个带有jQuery验证的"联系我"页面。我的主要内容框重新加载了 ajax,以便在用户单击新页面时更改内容。我现在遇到的问题是为验证函数绑定事件处理程序。我现在得到的是
$(document).ready(function(){
$('body').bind('focus focusout keyup', function() {
$('#contact_me').validate({
但它并没有按预期工作。我必须开始键入,然后单击输入字段,然后在开始验证输入字段值之前再次单击它。我希望它在焦点、focusout
和keyup
上验证。我认为问题出在事件处理程序上。有什么建议吗?
下面是一个带有脚本的 JSfiddle:https://jsfiddle.net/z6h9d028/4/
我现在可以看到事件处理程序不是问题。当我输入输入字段时,它不会验证值,直到我点击开箱即用。在第一次验证之后,我也在进行键控。我怎样才能让我立即在 keyup 上工作?
编辑2:更新小提琴:https://jsfiddle.net/z6h9d028/7/
它现在几乎可以工作了!我只需要在单击提交按钮时显示所有错误消息。并找到一种方法在键入一个字符时显示错误消息,然后在需要输入字段时将其删除(如果您键入一次,则会显示它,然后删除,再次键入并删除。 但不是第一次)
您不需要设置自己的事件侦听器,或者至少如果您这样做,则不应该在.validate()
方法上使用它们(请参阅下面的替代方法)。
删除整个$('body').bind()
部件,并将以下内容添加到验证设置对象:
onkeyup: function(element) {
$(element).valid();
// As sparky mentions, this could cause infinite loops, should be this:
// this.element(element);
},
这也应该更好,因为它可能会在如何处理 onkeyup 事件方面为您提供一些额外的自由度,例如如果您不希望它是即时的,请添加 setTimeout。
小提琴:https://jsfiddle.net/z6h9d028/5/
在onkeyup
中,您还可以调用$('#contact_me').valid()
,这将重新验证整个表单,尽管这可能不是您想要的结果。
编辑:Sparky还有帮助地提到jquery-valid默认允许keyup事件,但它仅在第一次提交后才这样做:jQuery valid插件:默认情况下在blur()上验证
另一种方法是设置当前验证的详细信息,而不使用onkeyup
函数,然后设置自己的侦听器并运行$(element).valid()
:
$('#contact_me').validate({
rules: {
// ...
}
});
$('input').on('focus focusout keyup', function () {
$(this).valid();
});
编辑有关其他问题的内容:
你的errorPlacement
功能是做一些时髦的事情。它如何决定什么是下一个兄弟姐妹似乎工作不正常。此外,您正在手动将错误 HTMLdiv 添加到您的 DOM 中,但它们实际上是由插件生成的。所以真的,你正在创建两者,然后试图展示它们,有点覆盖插件,有点不,整个事情正在陷入疯狂。
我认为,解决方案是删除这些错误div,删除该errorPlacement
函数,然后修改CSS选择器以获取任何以"-error"结尾的id,这是插件生成的。所以[id$='-error']
而不是.error_message
https://jsfiddle.net/z6h9d028/8/