Google "reCaptcha" иногда не отображается/отображается
иногда мне приходится перезагружать страницу несколько раз, пока окно отрисовывается. Я и друг тестировали как на Firefox, так и на Chrome, но проблема последовательна и, похоже, не зависит от используемого браузера.
код я использую, чтобы отобразить мой рекапчи это:
<script src='https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit' async defer></script>
<script>
var CaptchaCallback = function(){
grecaptcha.render('RecaptchaField1', {'sitekey' : '6LdbWAo..'});
grecaptcha.render('RecaptchaField2', {'sitekey' : '6LfAVAo..'});
grecaptcha.render('RecaptchaField3', {'sitekey' : '6LfqWwo..'});
grecaptcha.render('RecaptchaField4', {'sitekey' : '6Lf4sAo..'});
};
и позже в формах я только что добавил:<div id="RecaptchaField1"></div>
С правильным номером.
формы всегда внутри модального bootstrap, если это заботится?
Edit:
Я удалил async
и defer
атрибутации.
Edit 2: Страница, которая имеет проблемы:http://www.dexquote.com
4 ответов
эта проблема появилась со мной в Google maps при инициализации карты на скрытом div (например, модальном). Я бы решил эту проблему, удалив инициализацию из загрузки страницы и инициализируя каждую капчу, когда модальный отображается так:
$(document).ready(function () {
$('#loginModal').on('shown.bs.modal', function () {
grecaptcha.render('RecaptchaField1', {'sitekey': '6LdbWAoTAAAAAPvS9AaUUAnT7-UKQMxz6vY4nonV'});
})
$('#loginModal').on('hide.bs.modal', function () {
$("#RecaptchaField1").empty();
})
});
Если у вас есть одна страница с этой проблемой, удалите "defer async" из загрузки сценария recaptcha и поместите "defer" в функцию обратного вызова.
причина проблемы в том, что загрузка удаленных скриптов может длиться дольше, чем загрузка других локальных скриптов, поэтому ваша функция рендеринга вызывается до полной загрузки grecaptcha. Когда вы удалите defer async из удаленного скрипта и поместите defer на обратный вызов, grecaptcha будет загружен во время процесса загрузки страницы, и он вызовет обратный вызов функция, которая будет запущена после полной загрузки страницы, поэтому, если у вас нет других "отложенных" отмеченных скриптов, grecaptcha.render () будет последним, что нужно сделать на этой странице.
код будет выглядеть так:
<script src='https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit'></script>
<script defer>
var CaptchaCallback = function(){
grecaptcha.render('htmlElementId', {'sitekey' : 'yourSiteKey'});
};
</script>
у меня была аналогичная проблема, но моя капча не была оказана, и когда я попытался вызвать grecaptcha.getResponse () я увидел следующую ошибку:
Error: Invalid ReCAPTCHA client id: undefined
в моем случае все пользовательские скрипты были включены в нижней части HTML-файла, поэтому у меня было чистое состояние гонки, которое упоминалось в документах recaptcha.
Примечание: ваша функция обратного вызова onload должна быть определена до reCAPTCHA API загружается. Чтобы убедиться, что нет условий гонки:
порядок сначала ваши скрипты с обратным вызовом, а затем reCAPTCHA используют параметры async и defer в тегах скрипта (https://developers.google.com/recaptcha/docs/display)
С async
и defer
параметры captcha не удалось 1 из 10 (или иногда 1 из 30) перезагрузки страницы. Но когда я убрал их обоих-ситуация прояснилась, что было не так. Надеюсь, это упоминание кому-нибудь поможет.
просто поставить
<script src="https://www.google.com/recaptcha/api.js?onload=callback&render=explicit"></script>
В конце тега <body>
Ex.
<body>
...some html...
<div id='googleRecaptcha'></div>
<script src="https://www.google.com/recaptcha/api.js?onload=callback&render=explicit"></script>
</body>