J'ai un formulaire d'inscription avec le nouveau widget Google Recaptcha. Lorsqu'un utilisateur envoie des informations, nous vérifions la validation avec javascript et nous renvoyons les problèmes à la page (ex: "veuillez utiliser un numéro de téléphone valide"). Cependant, comme la page ne se recharge pas, lorsque l'utilisateur entre les informations correctes et va soumettre à nouveau (sans avoir à refaire recaptcha) ... le recaptcha n'est plus valide et il ne peut pas soumettre sans recharger la page.
y a-t-il une bonne solution à cela? puis-je recharger le widget en quelque sorte? J'ai essayé grecaptcha.render mais il n'a vraiment rien fait.
MODIFIER:
Lorsque j'essaie à nouveau de rendre le widget, il est indiqué que "l'élément d'espace réservé doit être vide"
J'ai essayé de vider l'élément qui semblait fonctionner ($ ('. G-recaptcha'). Empty ();) puis de le rendre, mais la même erreur a été renvoyée.
La méthode que vous recherchez est grecaptcha.reset()
Cependant, pour que cette fonction fonctionne, vous devez rendre explicitement le reCaptacha comme ceci: <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
J'ai pu le faire simplement en utilisant:
grecaptcha.reset();
Si vous utilisez grecaptcha.render avec jQuery, assurez-vous de définir un élément DOM au lieu d'un élément jQuery:
Ce va travail:
grecaptcha.render( $('.g-recaptcha')[0], { sitekey : 'your_key_here' });
mais cela ne veut pas :
grecaptcha.render( $('.g-recaptcha'), { sitekey : 'your_key_here' });
Personnellement, je réinitialise le contenu de mon élément html avec
$('#captcha').html('');
après cela, je recharge Recaptcha en utilisant
$.getScript("https://www.google.com/recaptcha/api.js");
qui charge le contenu recaptcha sur votre
<div id="captcha" class="g-recaptcha" data-sitekey="yourSitePublicKey"></div>
Voici du code pour accompagner la réponse de @ tzafar:
var myCaptcha = null;
function prepCaptcha() {
if (myCaptcha === null)
myCaptcha = grecaptcha.render(document.getElementById('my-captcha'), {
'sitekey': myCaptchaKey,
'theme': 'light'
});
else
grecaptcha.reset(myCaptcha);
}
Dans mon cas, my-captcha
est l'id d'une div
à l'intérieur d'un modal Bootstrap. J'exécute prepCaptcha()
dans le gestionnaire d'événements pour l'événement shown.bs.modal
du modal. La première fois, il initialise le captcha. Lors des shows suivants du modal, il le réinitialise.
Notez également que vous pouvez rapidement vérifier que vous obtenez un nouveau captcha en imprimant la valeur du captcha complété:
console.log(grecaptcha.getResponse(myCaptcha));
Vous ne devriez pas voir la même valeur deux fois.
votre événement recaptcha render js ne doit être appelé qu'une seule fois dans le script, votre code recaptcha n'est pas valide si l'événement grecaptcha.render
js est appelé une deuxième fois dans le script. Vous devriez vérifier votre code pour ne pas appeler la fonction grecaptcha.render
une deuxième fois lors du contrôle de validation.
OU
Dans la console, vous verrez un message d'erreur Uncaught ReferenceError: Recaptcha is not defined
, qui indique le problème rencontré avec le script reCAPTCHA. Cela est dû à une mauvaise URL dans la page - http://api.recaptcha.net/js/recaptcha_ajax.js
. Google a mis à jour le reCAPTCHA et a déplacé l'emplacement du script sur http://www.google.com/recaptcha/api/js/recaptcha_ajax.js
.
aussi vérifier ce post
http://www.instructables.com/id/Fix-reCAPTCHA-errors-on-Instructables/
et ce post
si vous utilisez new recaptcha 2.0, utilisez ceci: pour le code derrière:
ScriptManager.RegisterStartupScript(this, this.GetType(), "CaptchaReload", "$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});", true);
pour javascript simple
<script>$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});</script>
J'ai eu le même problème avec excelwebzone/recaptcha-bundle
pour Symfony2. En gros, on dit que recaptcha a été chargé dans votre DOM et l’espace réservé qui devrait être vide était plein.
Ces ensembles ne comportent pas de paramètres pour les rappels explicites, donc vous devez vous assurer que cet espace réservé ou même le formulaire entier est vide avant de charger recaptcha.
Et le mien était coincé dans DOM parce que je le chargeais avec AJAX. Au deuxième appel, c'était là.
Vous pouvez simplement utiliser $('#your-div-with-form').html('')
Si vous utilisez WordPress, assurez-vous de ne pas installer un autre plug-in reCaptcha ... c'est le problème qui me concerne.
Essayez d’appeler la fonction reload()
dans ReCaptcha (version 1):
Recaptcha.reload();
<script>
function cform(token) {
$.ajax({
type: 'POST',
url: 'contact_chk.php',
data: $('#cform').serialize(),
success: function(response) {
grecaptcha.reset();
$("#con_msg").html(response);
document.getElementById("name").value='';
document.getElementById("subject").value='';
document.getElementById("email").value='';
document.getElementById("phone").value='';
document.getElementById("message").value='';
},
error: function(response) {
grecaptcha.reset();
$("#con_msg").html('Try Again...');
}
});
}
</script>
<script src='https://www.google.com/recaptcha/api.js'></script>