在javascript中访问函数外部的变量

时间:2012-08-16 13:29:08

标签: ajax json forms function variables

我有一个小的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;
}​

3 个答案:

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

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

答案 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

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

因此你必须检查类型,

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

了解更多信息Rare Javascript Operators