2015-05-04 14 views
20

Chcę zresetować widżet Google reCaptcha po przesłaniu formularza za pośrednictwem AJAX i wystąpieniu błędów lub formularzu wejściowym. Używam wielu widżetów na tej samej stronie, więc wyraźnie renderuję te widżety.Resetowanie Google reCaptcha nie działa

Mój kod 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> 

Ładowanie widget

<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> 

Po Złożenie:

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

Forma jest wystąpienie złożonego formularza.

Wszystko działa prawidłowo, gdy formularz jest prawidłowo wypełniony. Ale reCaptcha nie resetuje ani nie ładuje ponownie. Wypróbować to grecaptcha.reset(), ale bez wyników.

Każdy pomysł?

+0

Czy wyświetla błąd? – RafaelKr

+0

Niestety nie :(Nie mam żadnych błędów Wygląda na to, że ponownie załaduję cały plik "recaptcha.js" ponownie – quarky

Odpowiedz

33

Metoda grecaptcha.reset() akceptuje opcjonalny parametr widget_id i domyślnie jest ustawiony na pierwszy widżet utworzony, jeśli nie jest określony. A widget_id jest zwracana z metody grecaptcha.render() dla każdego utworzonego widgetu. Więc trzeba przechowywać identyfikator i używać go zresetować tego konkretnego widżet:

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

See here.

+0

Wielkie dzięki, mam nadzieję, że to zadziała, ale nie, muszę zrobić coś złego. Mam aktualizację mojego kodu Może to pomaga, teraz otrzymuję komunikat o błędzie: "Nieprawidłowy identyfikator klienta ReCAPTCHA: recaptcha-1" Nie rozumiem, dlaczego identyfikator jest nieprawidłowy – quarky

+1

@quarky musisz zapisać wartość zwróconą przez 'grecaptcha.render', i być może dołączyć go do elementu, np .: 'var id = grecaptcha.render (etc); elements [i] .setAttribute ('cid', id);' a następnie użyć tego identyfikatora do usunięcia. – levi

+0

dziękuję bardzo. Tak, to był problem, teraz działa dobrze ... wielkie dzięki, – quarky

0

Przekazujesz nieprawidłowy identyfikator.

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

Twój selektor będzie przechwytywać wszystkie 20 Odśwież widżet, ale zwrócić tylko jeden identyfikator DOM (pierwszy Odśwież). Twój kod resetuje pierwszą recaptcha.

0

Wystarczy edytować kod, aby utworzyć dynamiczny widget.

<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> 

I po pomyślnym wykonaniu powyższego zadania, zmiany w sukcesie AJAX: odpowiedź

grecaptcha.reset(widgetId+id); 

Tutaj id byłby ten sam, który jest generowany z poniżej pętli for.