javascript - 试图让 jquery 验证中的 addMethod 工作。console.log 显示正确的响应,但始终无法通过验证
问题描述
我正在为 jQuery Validation 插件使用数据属性。我需要使用“远程”验证功能,但是,我需要根据使用的表单修改发送到远程位置的数据。我想使用数据属性而不是<script>
为每个表单创建调用。
我创建了一个自定义$.validator.addMethod
来处理这个问题,但是每次我运行它时,表单都会像返回一样返回false
。我添加了一个调用,console.log()
以确保数据返回true
或false
基于远程脚本返回,并且确实如此。true
它应该在什么时候返回,什么false
时候应该返回。
这是我的自定义添加方法:
$.validator.addMethod("dupcheck", function(value,element){
var method = element.getAttribute("data-method");
var data = { "dupcheckv" : value, "dupcheckm" : method };
$.post( "duplicate-check.php", data).done(function(response){
console.log(response);
return response;
});
});
我确实看过如何使 jquery “$.post” 请求同步 [duplicate]
,但async:false
已被弃用,因此无济于事。
解决方案
我通过复制所有remote
函数并将其放入addMethod
调用中使其工作:
$.validator.addMethod("dupcheck", function(value, element, param, method){
if ( this.optional( element ) ) {
return "dependency-mismatch";
}
method = typeof method === "string" && method || "dupcheck";
var previous = this.previousValue( element, method ),
validator, data, optionDataString;
if ( !this.settings.messages[ element.name ] ) {
this.settings.messages[ element.name ] = {};
}
previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
this.settings.messages[ element.name ][ method ] = previous.message;
param = typeof param === "string" && { url: param } || param;
optionDataString = $.param( $.extend( { data: value }, param.data ) );
if ( previous.old === optionDataString ) {
return previous.valid;
}
previous.old = optionDataString;
validator = this;
this.startRequest( element );
data = {};
data[ "dupcheckv" ] = value;
data[ "dupcheckm" ] = element.getAttribute("data-method");
$.ajax( $.extend( true, {
mode: "abort",
port: "validate" + element.name,
dataType: "json",
method: "POST",
data: data,
context: validator.currentForm,
success: function( response ) {
var valid = response === true || response === "true",
errors, message, submitted;
validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
if ( valid ) {
submitted = validator.formSubmitted;
validator.resetInternals();
validator.toHide = validator.errorsFor( element );
validator.formSubmitted = submitted;
validator.successList.push( element );
validator.invalid[ element.name ] = false;
validator.showErrors();
} else {
errors = {};
message = response || validator.defaultMessage( element, { method: method, parameters: value } );
errors[ element.name ] = previous.message = message;
validator.invalid[ element.name ] = true;
validator.showErrors( errors );
}
previous.valid = valid;
validator.stopRequest( element, valid );
}
}, param ) );
return "pending";
});
推荐阅读
- reactjs - Antdesign Datepicker 转换为 Typescript
- excel - 列范围 A 到 Z 的最后一个非空单元格
- php - 如何添加 Timber dump() 函数
- r - 面板数据中的月协方差计算 -r
- python - /admin/myschoolweb/album/add/ 处的 OperationalError - 没有这样的表:main.auth_user__old
- javascript - 如何在三角形多维数组中填充数字?
- sqlite - 在菜单上调用 startActivity 函数会使应用程序崩溃
- vim - 如何从vim中的跳转列表中删除缓冲区
- c++ - eclipse中的gtest错误:ld.exe找不到-llibgtest
- java - 是否应该将使用 String.indexOf 的 0 长度字符串“”的搜索行为视为未定义?