我将测试代码放在jsfiddle上。 请检查here
当我点击提交按钮时,为什么我会收到两次警告信息?
答案 0 :(得分:4)
你正在滥用验证功能,正如AndrewR所说的那样。有许多事情会改变调用验证函数的次数。在您的示例中,正在调用“规则”(在您的情况下是一个函数):
这是正确的,因为良好的验证会显示您在离开时刚刚编辑的字段上的错误以及许多其他事件。
如果要对特定字段的验证执行功能,最好添加一个OnValidating回调以将自定义方法运行到该字段。规则应该只是规则而不是方法,这就是回调的用途(是的,回调也会多次执行,因为很多事件会触发validate方法)。
如果您确实需要只触发一次并且仅在表单提交上,则禁用默认验证行为并添加手动validate()调用,如下所示:
$("#test1").submit(function() {
$("#test1").validate();
});
目前很平坦,但如果你需要,我可以弹出并提供一个例子。
PS:获得双重事件的另一种着名方法是将事件绑定两次。如果您不确定如何初始化页面,那么在绑定事件之前“取消绑定”事件通常会更安全。这肯定不是你的问题,但它可能会出现,当你试图解决你的问题,并可能导致混淆 - 它在过去对我有用:)
答案 1 :(得分:1)
这不是答案,而是一种解决方法。
因为这是google中出现的第一个结果,即使您可能不再关心答案,我也会发布这个结果。
我也在使用jQuery和jQuery validate插件。我在我的一个规则中运行了一些ajax代码,作为我的ajax新手,发出警报,以便我可以看到引擎盖下发生了什么。
警报开了两次,这是一个问题,因为这是我真正需要的两倍的流量。所以我开始在互联网上寻找理由/解决方案。我知道我想继续进行聚焦验证,所以我决定尽可能长时间禁用它。
当我最终屈服并且禁用它时,这就是我学到的东西。禁用onfocusout实际上似乎没有禁用该功能,但它确实不会触发两次。用这个开始我的验证码......
$("#FORMNAME").validate({
onkeyup: false,
onfocusout: false,
...在我第一次点击提交按钮后实际上没有停止验证,这实际上是我想要的;单击,查看问题,修复问题,并在用户标签或点击时查看更新。那仍然很漂亮,额外的警报也消失了。
我很想知道那里发生了什么,但我很高兴看到它有效。据推测,onfocusout验证中的某些内容与jQuery validate通常的提交后按钮行为相冲突,导致验证触发两次。
(是的,这些信息可能在文档中,但请随时将您的RTFM评论指向其他地方。)
tldr:禁用onkeyup和onfocusout,任何警报只会触发一次。您不会失去尽可能多的功能。
答案 2 :(得分:0)
据我所知,这是因为你有一个“提交”类型的按钮。因此,jQuery验证运行了两次;一旦文本输入失去焦点,再次重新加载页面时。如果我错了,我希望有人纠正我,但是当我更改按钮以输入“按钮”时,双重警报似乎消失了。
HTH。
编辑:好吧,看起来我错了,所以请忽略上面的建议。一定是我正在使用的浏览器的一个临时怪癖。