我正在尝试使用jquery Real Person(http://keith-wood.name/realPerson.html)。根据说明,这是我的JavaScript代码。 $(“#sb1”)是提交按钮。
我遇到了一个计时问题,因为涉及到一个ajax调用,其中显示了“// bValid此时未显示”的注释,bValid未定义。任何想法如何延迟“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";
}
答案 0 :(得分:0)
因为你在回调函数内部返回ajax函数,它将其值返回给回调函数,而不是外部函数checkCaptcha()。在checkCaptcha()完成之前,没有办法让你的bValid变量等待,所以不要那样,在ajax函数回调中放置你想要做的bValid变量,如下所示:
$.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
}
});
答案 1 :(得分: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
}
});
});
显然我遗漏了你的代码的某些部分,这些部分对于查看此页面的其他人来说是不敬的,所以你必须把它们放回去,但是“jist”就在那里......
另外,只是旁注,但我个人更喜欢实际的Captcha API。它不仅更安全,而且还是一个非常惊人的实用工具,可以帮助同时对旧文本进行数字化处理。对你使用的那个没有任何反对意见,但它看起来非常难以理解。