2015-05-04 32 views
20

Formumuzu AJAX aracılığıyla gönderdiğimde ve bazı giriş hataları veya formu gönderildiğinde Google reCaptcha widget'ını sıfırlamak istiyorum. Aynı sayfada birden çok widget kullanıyorum, bu yüzden bu widget'ları açık bir şekilde oluşturuyorum.Google reCaptcha sıfırlama çalışmıyor

Benim HTML kodu:

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

Yükleme 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> 

sonra teslim formu:

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

Form gönderildi formun örneğidir.

Form doğru şekilde doldurulduğunda her şey düzgün çalışıyor. Ancak reCaptcha sıfırlamaz veya yeniden yüklenmez. Bu grecaptcha.reset()'u deneyin, ancak sonuç yok.

Herhangi bir fikrin var mı?

+0

Hata mı veriyor? – RafaelKr

+0

Maalesef no :(. Hiç hatam yok. Yeniden "recaptcha.js" dosyasını yeniden yüklediğine benziyor. – quarky

cevap

33

grecaptcha.reset() yöntemi, isteğe bağlı bir widget_id parametresini kabul eder ve belirtilmemişse varsayılan olarak varsayılan ilk pencere aracını kabul eder. Oluşturulan her pencere öğesi için widget_id, grecaptcha.render() yönteminden döndürülür. Yani bu kimliği saklamak ve bu özel widget'ı sıfırlamak için bunu kullanmak gerekir:

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

See here.

+0

Çok teşekkürler, umarım bu işe yaramaz, değil, yanlış bir şey yapmalıyım. Belki şu an yardımcı oluyor: Hata alıyorum: 'Geçersiz ReCAPTCHA istemci kimliği: recaptcha-1'.Neden kimliğinin yanlış olduğunu anlamıyorum. – quarky

+1

@ 'grecaptcha.render' tarafından döndürülen değeri saklamanız gerekiyor. ve belki de bunu elemanlara ekleyiniz, örneğin: var id = grecaptcha.render (etc); elementler [i] .setAttribute ('cid', id); 've daha sonra bu kimliği kaldırmak için kullanmalısınız – levi

+0

çok teşekkür ederim. Evet, sorun buydu.Şimdi iyi çalışıyor.Çok teşekkürler: – quarky

0

Yanlış kimliği iletiyorsunuz.

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

Sizin seçici 20 ReCaptcha widget'ı yakalamak, ancak yalnızca tek bir DOM id (ilk ReCaptcha) döndürecektir. Yani kodun aslında ilk recaptcha sıfırlanıyor.

0

Sadece dinamik bir widget oluşturmak için kodunuzu düzenlediniz.

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

Ve başarıyla AJAX başarıda yukarıdaki görevi, değişiklik tamamladıktan sonra: tepkisini İşte

grecaptcha.reset(widgetId+id); 

id Döngü için aşağıdan oluşturulduğunun aynı olacaktır.