我几天来一直处理这些问题,而且我似乎无法自己解决这个问题。我已经在Stack上就此问了一个问题,但是我被告知这是通过使用回调函数来解决的。我已经做到了,但回调中的变量仍未改变。
我正在使用内置于Foundation框架中的abide验证,我正在尝试使用自己的自定义验证程序来检查我们的数据库中是否已存在电子邮件。一切正常,甚至console.log都会返回正确的结果,但变量值不会从false更改为true。 仅检查来自emailVerification的代码。
感谢您的帮助。
$(document).foundation({
abide : {
live_validate : false, // validate the form as you go
validate_on_blur : false,
patterns: {
positive_price: /^\+?[0-9]*\,?[1-9]+$/,
},
validators: {
positiveNumber: function(el, required, parent) {
var value = el.value.replace(/,/, '.'),
valid = (value > 0);
return valid;
},
emailVerification: function (el, required, parent) {
var email = el.value,
ajax = 1,
valid = false;
function checkServer(callback) {
$.ajax({
type: "GET",
url: "/check.do?action=userEmailAvailable",
data: "userEmail1=" + email + "&ajax=" + ajax,
success: callback
});
}
checkServer(function(data) {
if (data.result == 1) {
console.log(data.result + "does not exist");
valid = true;
} else {
console.log(data.result + "already exist");
valid = false;
}
});
return valid;
}
}
}
});
答案 0 :(得分:1)
在positiveNumber函数中声明的有效内容仅限于该函数的本地作用域。下次尝试在函数外部访问它时,实际上会创建一个名为valid
的全局变量答案 1 :(得分:1)
$ .ajax以异步方式运行。函数在调用回调函数之前返回“valid”。您可以尝试同步运行ajax请求,或者需要在回调函数中添加逻辑,以便在调用时更新“valid”
How to create sync ajax
添加验证功能给你回调
<my:linkButton ... icon="fa fa-edit" />
如果您确定服务器验证速度足够快,则可以执行
checkServer(function(data) {
if (data.result == 1) {
console.log(data.result + "does not exist");
valid = true;
} else {
console.log(data.result + "already exist");
valid = false;
}
DoCoolValidation(valid)
});
并使用它:
function Validate(dataToSend) {
return JSON.parse($.ajax({
url: '/check.do?action=userEmailAvailable',
type: "GET",
dataType: "json",
data: dataToSend,
async: false
}).responseText);}
查看this帖子。它可以帮助
答案 2 :(得分:1)
许多人回答说,您需要异步验证和Abide does not support this。
我建议您使用优秀的Parsley.js库,它通过Remote plugin
支持异步验证器