2015-05-04 19 views
20

Desidero reimpostare il widget di Google reCaptcha quando invio il mio modulo tramite AJAX e ho alcuni errori di input o modulo inviato. Sto usando più widget sulla stessa pagina, quindi renderò questi widget esplicitamente.Reimpostazione di Google ReCaptcha non funziona

Il mio codice HTML:

<div class="g-recaptcha" id="recaptcha-1"></div> 
<div class="g-recaptcha" id="recaptcha-2"></div> 
... 
<div class="g-recaptcha" id="recaptcha-20"></div> 

widget Caricamento in corso

<script src="https://www.google.com/recaptcha/api.js?onload=reCaptchaCallback&render=explicit&hl=en" async defer></script> 
<script> 
    var reCaptchaCallback = function() { 
     var elements = document.getElementsByClassName('g-recaptcha'); 
     for (var i = 0; i < elements.length; i++) { 
      var id = elements[i].getAttribute('id'); 
      grecaptcha.render(id, { 
       'sitekey' : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 
      }); 
     } 
    }; 
</script> 

Dopo presentare il modulo:

var id = $('.g-recaptcha', form).attr('id'); 
grecaptcha.reset(id); 

La forma è l'istanza del modulo inviato.

Tutto funziona correttamente quando la forma viene riempita correttamente. Ma reCaptcha non si resetta o ricarica. Prova questo grecaptcha.reset() ma nessun risultato.

Qualche idea?

+0

Invia un errore? – RafaelKr

+0

Purtroppo no :(. Non ho errori, sembra che ricarichi di nuovo l'intero file 'recaptcha.js'. – quarky

risposta

33

Il metodo grecaptcha.reset() accetta un parametro opzionale widget_id e il valore predefinito è il primo widget creato se non specificato. A widget_id viene restituito dal metodo grecaptcha.render() per ciascun widget creato. Quindi è necessario memorizzare questo ID, e utilizzarlo per ripristinare quel widget specifici:

var widgetId = grecaptcha.render(container); 
grecaptcha.reset(widgetId); 

See here.

+0

Molte grazie, spero che funzionerà ma non. Devo fare qualcosa di sbagliato. Ho aggiornato il mio codice Forse è d'aiuto, ora sto ricevendo un errore: 'ID client ReCAPTCHA non valido: recaptcha-1' .Non capisco perché l'ID sia sbagliato. – quarky

+1

@quarky è necessario memorizzare il valore restituito da' grecaptcha.render', e forse collegalo all'elemento, ad esempio: 'var id = grecaptcha.render (etc); elementi [i] .setAttribute ('cid', id);' e quindi usa quell'id per la rimozione. – levi

+0

grazie mille. Sì, questo era il problema, ora funziona perfettamente Grazie mille – quarky

0

Si sta passando l'id errato.

$('.g-recaptcha', form).attr('id');

vostro selettore catturerà tutti i 20 widget di reCAPTCHA, ma restituire solo un singolo ID DOM (il primo reCaptcha). Quindi il tuo codice sta effettivamente ripristinando il primo recaptcha.

0

È stato appena modificato il codice per creare un widget dinamico.

<script> 
    var reCaptchaCallback = function() { 
     var elements = document.getElementsByClassName('g-recaptcha'); 
     for (var i = 0; i < elements.length; i++) {     
      widgetId+i = grecaptcha.render('recaptcha-'+i, { 
       'sitekey' : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 
      }); 
     } 
    }; 
</script> 

E dopo aver completato con successo il compito di cui sopra, il cambiamento nel successo AJAX: risposta

grecaptcha.reset(widgetId+id); 

Qui l'id sarebbe la stessa che viene generato dal sotto per Loop.

Problemi correlati