jquery.validate 与 jquery.avgrund合用导致的验证出错

ERROR:

jquery.validate 是一个基于jQuery的表单验证插件。
http://jqueryvalidation.org/
jquery.avgrund是一个弹出窗口插件,效果不错,使用简单。
https://github.com/voronianski/jquery.avgrund.js

使用jquery.avgrund弹出表单+使用jquery.validate验证表单1.14.0
结合使用发生错误,第一次打开弹出框时validate工作正常,当关闭弹出框,再打开弹出框后验证失效。

FIND

1、分析jquery.validate,30行左右源码如下,由此我们猜this[0]对象存储的validator属性很重要,可能实现了validate的功能。
jquery.validate 与 jquery.avgrund合用导致的验证出错_第1张图片
通过console.log()发现,this是一个jquery对象。也就是执行validate的jquery元素。在这里就是执行validate的表单选择器,this[0]代表了它所转化后的表单dom对象(下文中我们用[form]代指该对象)。

2、分析jquery.avgrund源码,可以找到一个active方法与一个deactive方法,分别负责打开与关闭,
因为问题与关闭后重新打开有关,我们同时在jquery.avgrund源码中active方法开头处与deactive方法开头处加入console.log代码,输出前文提到的[form]和$.data([form],”validator”)做对比。

最终锁定在代码123行,以下代码执行后$.data([form],”validator”)变为了undefined。

/* jquery.avgrund 123行代码 */
setTimeout(function () {
    $('.avgrund-popin').remove();
}, 500);

HANDLE

1、那我们手动定义一个validator,在remove()代码执行过后重新赋值。

var validator = $.data([form],"validator")
/* 123行代码 */
setTimeout(function () {
    $('.avgrund-popin').remove();
}, 500);

$.data([form],"validator",validator )

虽然这样的话$.data([form],”validator”)的值的确保持不为undefined。但validate方法依旧无效,也许validate效果的执行并不仅取决于这一个属性。
我们把同样的方法应用在[form]整个元素上,依然无效。

2、为什么remove()方法会改变dom元素的属性呢?带着这个疑问我去看了remove()的解释,

jquery.validate 与 jquery.avgrund合用导致的验证出错_第2张图片

这下明白了,remove不仅移除元素,还删除附加的数据和事件,也就是validate赖以生效的根本。
把123行代码中的remove()更改为detach(),问题解决。

你可能感兴趣的:(jquery)