1

我有一个小的 javascript 函数可以在提交时验证我的表单。

有了这个,我做了一些基本的验证来检查事情不是空的。如果一个人是否超过 18 岁,还有一个 ajax/json 请求返回 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;
}​
4

3 回答 3

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;
          }
     }
});

http://www.w3schools.com/js/js_variables.asp

于 2012-08-16T13:33:10.840 回答
0

欢迎来到异步回调的美妙世界!

我在这里看到的主要问题是您正在使用$.getJSON,并期望它内联执行。你的函数写在问题中的方式,语句

return valid;

将在(以下语句)的结果函数之前执行:$.getJSON

//Check dob
var age = result.age

if (age) {
    //Do nothing
} else {
    valid = false;
}

如果您希望在获得 AJAX 调用的结果return执行该语句,则必须使 AJAX 调用synchronous,而不是asynchronous。达伦的回答向您展示了如何做到这一点。

问题中所写的函数的第二个问题是,它valid是在函数开始时分配true的,然后被分配false了几次,但它再也不会接收到值true了!这是您的实际代码吗?如果没有,您能否编辑您的问题,并调整它以匹配您的实际代码?

于 2012-08-16T16:11:25.423 回答
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。

以下值将被评估为假,而所有其他值将被评估为真

  • 0 或 -0(由于 IEEE 754 标准,大多数浮点实现都有正零和负零)
  • 空值
  • 不明确的
  • 空字符串(“”)
  • false本身

因此,您也必须检查类型,

age !== 0在 if 条件中使用。

更多信息罕见的 Javascript 运算符

于 2012-08-16T16:26:37.193 回答