Подключаю скрипт гугл каптчи
| Код |
|---|
<sc ript class="g-recaptcha-script" src="https://www.google.com/recaptcha/api.js onl oad=onloadCallbackGoogleRecaptcha&render=explicit" async defer></sc ript> |
| Код |
|---|
<div class="g-recaptcha-dynamic-initialized" id="g-recaptcha-dynamic-initialized1"></div> еще одна форма <div class="g-recaptcha-dynamic-initialized" id="g-recaptcha-dynamic-initialized2"></div> |
Таких форм несколько и гугл каптч будет тоже несколько
Теперь запускается функция: onloadCallbackGoogleRecaptcha
| Код |
|---|
var allCapthaForms = new Array()
var onloadCallbackGoogleRecapt cha = function() {
var wss = document.getElementsByClassName('g-recaptcha-dynamic-initialized')
Array.prototype.filter.call(wss, function(ws, i){
id = ws.getAttribute('id')
w=grecaptcha.render(id, {
'sitekey' : '<?=RE_SITE_KEY?>',
})
allCapthaForms.push(w)
});
}; |
Что она делает: инициализирует гугл каптчи и запоминает widget_id в массив allCapthaForms
Затем когда форма отправляется на сервер, через ajax, форма перезагружается и иницилазированная капча пропадает, ее нужно инициализировать заново, для этого написал это:
| Код |
|---|
var resetAllCapthaForms=function () {
allCapthaForms.forEach(function (item) {
grecaptcha.reset(item)
})
onloadCallbackGoogleRecaptcha()
} |
здесь я пытаюсь перебрать массив allCapthaForms и сделать grecaptcha.reset(item) каждой капчти, а затем снова запустить рендеринг функцией onloadCallbackGoogleRecaptcha()
НО! Все работает если форма одна! Но если форм больше одной, то я получаю ошибку:
| Код |
|---|
recaptcha__ru.js:596 Uncaught Error: reCAPTCHA has already been rendered in this element at Object.$l [as render] (recaptcha__ru.js:596) at (index):2393 at HTMLCollection.filter () at onloadCallbackGoogleRecaptcha ((index):2391) at resetAllCapthaForms ((index):2403) at :2:9 at Function.BX.evalGlobal (kernel_main_v1.js?1549274874311659:15) at Function.BX.evalPack (kernel_main_v1.js?1549274874311659:15) at parent.bxcompajaxframeonload ((index):98) at kernel_main_v1.js?1549274874311659:23 |
Как я понимаю функция grecaptcha.reset(item) сбрасывает только первую форму. А остальные не хочет. На всех сайтах только и пишут про эту функцию а в качестве параметра ей передавать widget_id что я и делаю. Или что то все таки упускаю?