2011-07-31 5 views
0

私はreCAPTCHAとAJAXを使用してCAPTCHAを検証しようとしています。変数を設定していないJQueryを使用したAJAX呼び出し

私はそれをすべて行う機能がありますが、フォームを送信するかどうかを指定するために、呼び出し関数にtrueまたはfalseの値を返す必要があります。

私のAJAXコールは正しく処理されていますが、CAPTCHAが無効であることを示すフラグが設定されている場合は設定されていません。 formValid上記のコードが間違っていた、常に真であるとして

私は formValid = falseが何らかの理由で動作しない設定
function validateComment(isReply) 
{ 
    formValid = true; 
    if (isReply) { qualifier = "Reply"; } else { qualifier = "New"; } 
    $("#comment" + qualifier + "Error").hide(); 
    $.post("/scripts/checkcaptcha.php", 
    { 
     recaptcha_challenge_field : $('#recaptcha_challenge_field').val(), 
     recaptcha_response_field : $('#recaptcha_response_field').val() 
    }, 
     function(data) 
     { 
      if (data == "invalid") 
      { 
       $("#comment" + qualifier + "Error").html("<p>Incorrect CAPTCHA entered</p>"); 
       $("#comment" + qualifier + "Error").slideDown(); 
       formValid = false; 
       Recaptcha.reload(); 
      } 
     } 
    ); 
    alert(formValid); 
    return false; 
} 

、それが設定されていない:私はそれだけでなくので、ここで説明していないよ

コードです。

これは、物事の処理方法と関係があると推測しています。

なぜ、どのように私はこれを修正することができますか?

ありがとうございました。

+1

はあなたの関数の外側 'formValid'変数宣言を移動しようとしたことがありますか?これはスコープの問題かもしれません... –

+1

'formValid = false'の文が実行されているかどうか(デバッグポイントかアラートで)チェックしましたか?どうすれば 'if(data ==" invalid ")'の前の文はどうですか? – Nivas

+0

'formValid = false;'を除いてすべてが実行されています。関数の外で 'formValid = true; 'を動かしてみましたが、私はまだ同じ動作をします。 – Tom

答えて

1

これは確かにvalidateComment関数が最初に実行されるためです。あなたのajaxレスポンス処理関数はコールバック関数なので、レスポンスがロードされるまで実行されません(validateCommentはすでに実行されており、この時点までに値が返されます)。これを修正するには、グローバルブール変数(例:is_loaded)を設定し、ループに入り、is_loadedがtrueになるまで待つか、setInvtervalを使用して100msごとに何かをチェックすることができます。

編集:または、変数に応答をロードし、そのようにエラーをチェックすることができます。

var html = $.ajax({ 
    url: "some.php", 
    async: false 
}).responseText; 
+0

これが空白を返す理由は何ですか? recaptcha_response_field:$( '#recaptcha_challenge_field'); val(); $( '#recaptcha_challenge_field')は、 responseText; 'PHPページは、有効で無効な' echo 'invalid'などを出力します。 – Tom

+0

これは機能していなければなりませんでした。キャッシュされたものなど。 – Tom

+0

素晴らしい!申し訳ありませんが家ではなかったので、早くあなたを助けなかった。 –

1

用途:

function validateComment(isReply,callback) 
{ 
    var callback=callback||false,formValid = true,qualifier = "New"; 
    if (isReply) qualifier = "Reply"; 
    $("#comment" + qualifier + "Error").hide(); 
    $.post("/scripts/checkcaptcha.php", 
    { 
     recaptcha_challenge_field : $('#recaptcha_challenge_field').val(), 
     recaptcha_response_field : $('#recaptcha_response_field').val() 
    }, 
    function(data){ 
      if (data == "invalid") 
      { 
       $("#comment" + qualifier + "Error").html("<p>Incorrect CAPTCHA entered</p>"); 
       $("#comment" + qualifier + "Error").slideDown(); 
       formValid = false; 
       Recaptcha.reload(); 
      } 
    }).complete(function(){ 
     if(typeof callback=='function') callback(formValid); 
    }); 
} 

validateComment(true,function(formValid){ 
    if(formValid){ 
    //... 
    } 
    else{ 
    //... 
    } 
}); 
+0

これを試しても動作しません。 Tom

+1

新しいものを試して、何が表示されるか教えてください。 – Darm

+0

ちょっとダーム、私は実際に美しく働くために上記の '$ .ajax'を手に入れました。感謝の気持ちで私はあなたとまったく同じように+1しました、ありがとうございます。 – Tom

関連する問題