1

送信時にフォームを検証するための小さな JavaScript 関数があります。

それで、私は物事が空でないことを確認するためにいくつかの基本的な検証を行います。人が 18 歳以上かどうかに応じて 1 または 0 を返す ajax/json リクエストもあります。

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

非同期コールバックの素晴らしい世界へようこそ!

ここで目にする主な問題は、 を使用して$.getJSONいて、インラインで実行されることを期待していることです。あなたの関数が質問に書かれている方法、ステートメント

return valid;

(次のステートメント)の結果関数のに実行されます。$.getJSON

//Check dob
var age = result.age

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

AJAX 呼び出しの結果を取得した後returnにステートメントを実行する場合は、AJAX 呼び出しを非同期ではなく同期にする必要があります。ダレンの答えは、その方法を示しています。

質問に書かれているように、関数の2番目の問題は、関数の開始時にvalid割り当てられ、その後数回割り当てられますが、二度と値を受け取ることはありません! これはあなたの実際のコードですか?そうでない場合は、質問を編集して、実際のコードに合わせて調整してください。truefalsetrue

于 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 と評価するためです。

次の値は false と評価され、他のすべての値は true と評価されます。

  • 0 または -0 (ほとんどの浮動小数点実装では、IEEE 754 標準により、正と負のゼロがあります)
  • ヌル
  • 未定義
  • NaN
  • 空の文字列 ("")
  • false自体

したがって、タイプも確認する必要があります。

age !== 0if 条件内で代わりに使用します。

詳細については、まれな Javascript 演算子

于 2012-08-16T16:26:37.193 に答える
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 に答える