2009-10-28 2 views
0

Je dois mettre un délai d'une seconde dans cette fonction jQuery de sorte que lorsque le captcha est rempli correctement, il y a un délai suffisant (une seconde, je pense) pour le #captchaStatus montrer avant la prochaine étape du processus (qui est un html affiché).Besoin d'un délai dans une fonction jQuery

Doit être assez facile, même si j'apprends jQuery .... Idées? Merci.

function validateCaptcha() 
{ 
    challengeField = $("input#recaptcha_challenge_field").val(); 
    responseField = $("input#recaptcha_response_field").val(); 
    //alert(challengeField); 
    //alert(responseField); 
    //return false; 
    var html = $.ajax({ 
    type: "POST", 
    url: "/wp-content/themes/default/ajax.recaptcha.php", 
    data: "recaptcha_challenge_field=" + challengeField + "&recaptcha_response_field=" + responseField, 
    async: false 
    }).responseText; 

    if(html == "success") 
    { 
     $("#captchaStatus").html("You got it right - I'm sending the email now...."); 
     return true; 
    } 
    else 
    { 
     $("#captchaStatus").html("Your captcha is incorrect - please try again..."); 
     Recaptcha.reload(); 
     return false; 
    } 
} 

Répondre

4

Vous devez utiliser un rappel. check out this jQuery FAQ item on this.

Le code ne fonctionne pas comme souhaité en raison de la nature de la programmation asynchrone. Le gestionnaire de succès fourni n'est pas appelé immédiatement, mais plutôt à un certain moment dans le futur lorsque la réponse est reçue du serveur. Ainsi, lorsque nous utilisons la variable 'status' immédiatement après l'appel $ .ajax, sa valeur n'est toujours pas définie.

getUrlStatus('getStatus.php', function(status) { 
    alert(status); 
}); 


function getUrlStatus(url, callback) { 
    $.ajax({ 
    url: url, 
    complete: function(xhr) { 
     callback(xhr.status); 
    } 
    }); 
} 
+0

De même, si vous êtes incommensurablement paresseux, vous pouvez simplement définir async sur false. Notez que cela provoquera le gel de l'interface utilisateur pendant l'appel. –

+0

Je pense qu'il veut faire une pause pendant une seconde entre montrer le message de succès à l'utilisateur et poster le formulaire. – joshperry

+0

C'est ce que j'essaie de faire, pause pendant une seconde .... – markratledge

1

Vous pouvez truquer le retard en animant une propriété bénigne comme l'opacité du 1 au 1 sur 1 seconde et sur le rappel d'achèvement soumettre votre formulaire ...

$("#captchaStatus") 
    .html("You got it right - I'm sending the email now....") 
    .animate({opacity: 1.0}, 1000, "linear", function() { 
     submitMyForm(); 
    }); 
+1

Je voudrais être paresseux et essayer ceci, mais je ne peux pas le faire fonctionner. On dirait que je devrais apprendre à utiliser un rappel, comme ci-dessus? – markratledge

0

Le secret est fonction JS non jQuery setTimeout. Cela exécutera votre opération 1 seconde plus tard:

setTimeout(function() { 
    $("#captchaStatus").html("You got it right - I'm sending the email now...."); 
}, 1000); 
+0

Impossible de faire fonctionner ça non plus. En fait, le texte imprimé par '# captchastatus' souffle encore plus vite. – markratledge