我有一个小的javascript函数可以在提交时验证我的表单。
我做了一些基本的验证来检查事情是不是空的。还有一个ajax / json请求,如果一个人超过18,则返回1或0。
一切正常,除了json部分不会对脚本的其余部分返回有效,它只是本地的那部分,对于我的生活,我无法弄清楚如何让它工作。
function validate_form() {
valid = true;
//Set varialbles
var firstname = $('#firstname').val();
var lastname = $('#lastname').val();
var email = $('#email').val();
var comments = $('#comments').val();
var day = $('#day').val();
var month = $('#month').val();
var year = $('#year').val();
if ($('[name=photo]').val() == "") {
$('#formtext1').fadeOut('fast', function() {
$('#formtext2').fadeIn('fast', function() {
// Animation complete.
});
});
valid = false;
}
//check that terms have been accepted
if (myForm.terms.checked == false) {
$('#formtext1').fadeOut('fast', function() {
$('#formtext2').fadeIn('fast', function() {
// Animation complete.
});
});
valid = false;
}
if (firstname != "" && lastname != "" && email != "" && comments != "" && day != "" && month != "" && year != "") {} else {
$('#formtext1').fadeOut('fast', function() {
$('#formtext2').fadeIn('fast', function() {
// Animation complete.
});
});
valid = false;
}
$.getJSON('mydomainhere.com/dob_validate/' + day + '/' + month + '/' + year, function(result) {
//Check dob
var age = result.age
if (age) {
//Do nothing
} else {
valid = false;
}
});
return valid;
}
答案 0 :(得分:0)
您的功能需要var valid=true;
在顶部(或外部使其全局化)。看起来你正在创建一个局部变量,当你得到的结果超出了代码块之后的范围。
从我的评论中将其设为异步:
$.ajax({
url: 'mydomainhere.com/dob_validate/',
dataType: 'json',
async: false,
data: day + '/' + month + '/' + year,
success:
function(result) {
var age = result.age
if (age) { }
else {
valid = false;
}
}
});
答案 1 :(得分:0)
欢迎来到奇妙的异步回调世界!
我在这里看到的主要问题是你正在使用$.getJSON
,并期望它是内联执行的。你的函数写在问题中的方式,语句
return valid;
将在$.getJSON
(以下语句)的结果函数>之前执行:
//Check dob
var age = result.age
if (age) {
//Do nothing
} else {
valid = false;
}
如果你希望在后执行{{1>}语句,你得到AJAX调用的结果,你将不得不进行AJAX调用同步 ,而不是异步。 Darren的回答告诉你如何做到这一点。
问题中写的函数的第二个问题是,return
在函数开头被赋予valid
,然后它被分配true
几次,但它永远不会再次收到false
的价值!这是你的实际代码吗?如果没有,是否可以编辑您的问题,并根据您的实际代码进行调整?
答案 2 :(得分:0)
从上面的讨论中,我假设您已经更改了选项async:false
,否则将会有另外一个案例需要考虑。
我怀疑, 返回的年龄类型是字符串,然后让我们说
var age = '0';
age == 0; // will be evaluated as true,
// because it only looks for same value by converting to same type
由于返回的age
是字符串(我的假设),代码的else
部分永远不会被执行。因为if条件会将非空字符串计算为true。
以下值将被评估为false,而所有其他值将评估为true
false
本身因此你必须检查类型,
在if条件中使用age !== 0
。