0

jquery Real Person ( http://keith-wood.name/realPerson.html ) を使用しようとしています。指示に従って、これが私のjavascriptコードです。$("#sb1") は送信ボタンです。

「//bValid is UNDEFINED at this point」というコメントが表示され、bValid が定義されていない ajax 呼び出しが関係しているため、タイミングの問題が発生しています。「bValid = bValid && checkCaptcha();」を遅らせる方法についてのアイデア それまでに ajax 呼び出しが完了するようにコーディングしますか?

ありがとう、ロケット

function checkCaptcha() {

  // Call php file to check this

  $.post("ajax/check_captcha.php", { realPerson : $("#defaultReal").val(), realPersonHash: $(".realperson-hash").val()} ,
        function(data) {
        // If data = Error reload page
          if ($.trim(data) == "Error")  {
            updateTips("Captcha does not match");
           return false;
          } else {
            return true;
          }
      });
}

...

$("#sb1").click(function() {
      var bValid = true;
      bValid = bValid && checkLength($("#title"), "name", 3, 100 );
      bValid = bValid && checkCaptcha(); //bValid is UNDEFINED at this point
      alert("bValid is "+bValid);

      if ( bValid ) {
        setTimeout("$('#submitCampForm').submit();",500);
      }
});

PHP コードは変更されていません (check_captcha.php)。

function rpHash($value) {
    $hash = 5381;
    $value = strtoupper($value);
    for($i = 0; $i < strlen($value); $i++) {
        $hash = (leftShift32($hash, 5) + $hash) + ord(substr($value, $i));
    }
    return $hash;
}

// Perform a 32bit left shift
function leftShift32($number, $steps) {
    // convert to binary (string)
    $binary = decbin($number);
    // left-pad with 0's if necessary
    $binary = str_pad($binary, 32, "0", STR_PAD_LEFT);
    // left shift manually
    $binary = $binary.str_repeat("0", $steps);
    // get the last 32 bits
    $binary = substr($binary, strlen($binary) - 32);
    // if it's a positive number return it
    // otherwise return the 2's complement
    return ($binary{0} == "0" ? bindec($binary) :
        -(pow(2, 31) - bindec(substr($binary, 1))));
}

if (rpHash($_POST['realPerson']) == $_POST['realPersonHash']) {
} else {
  print "Error";
}
4

2 に答える 2

0

コールバック内で ajax 関数に戻っているため、その値は外側の関数 checkCaptcha() ではなく、コールバック関数に返されています。checkCaptcha() が終了するまで bValid 変数を待機させる方法はないため、その代わりに、bValid 変数でやりたいことを ajax 関数コールバック内に置きます。

$.post("ajax/check_captcha.php", { whatever: whatever} ,function(data) {
    // If data = Error reload page
    if ($.trim(data) == "Error")  {
        updateTips("Captcha does not match");
    } else {
        setTimeout("$('#submitCampForm').submit();",500); //line added
    }
});
于 2013-05-28T01:15:07.613 に答える
0

サーバー呼び出しの成功を信頼するためにタイムアウトを使用することは決してありません。正確なプロセスを保証するためにコールバック引数を使用します。

function checkCaptcha(CB){
  $.post(
    "file",
    options,
    function(data) {
      if($.trim(data) == "Error")  {
        updateTips("Captcha does not match");
        CB && CB(false);
      }else{
        CB && CB(true);
      }
    }
  );
}

$('#sb1').click(function(){
  checkCaptcha(function(status){
    if(status){
      // captcha true
    }else{
      // captcha false
    }
  });
});

明らかに、このページを閲覧している他の人に不敬なコードの一部を省略したため、それらを元に戻す必要がありますが、「ジスト」はすべてそこにあります...

また、補足ですが、私は個人的には実際のCaptcha API の方が好きです。安全性が高いだけでなく、古いテキストを同時にデジタル化するのに役立つ非常に優れたユーティリティでもあります。あなたが使っているものには何の反対もありませんが、非常にハッキングされやすいようです。

于 2013-05-28T01:21:16.557 に答える