W tym dokumencie opisujemy sprawdzone metody wczytywania tagu skryptu reCAPTCHA. Te informacje dotyczą zarówno reCAPTCHA v2, jak i v3.
Asynchroniczne wczytywanie reCAPTCHA
Wszystkie wersje reCAPTCHA można ładować asynchronicznie. Wczytuję reCAPTCHA asynchronicznie nie wpływa na możliwość rozpoznawania podejrzanego ruchu. Termin z korzyściami związanymi z wydajnością skryptów asynchronicznych, wczytanie reCAPTCHA asynchronicznie.
<script async src="https://www.google.com/recaptcha/api.js">
Podczas asynchronicznego wczytywania reCAPTCHA pamiętaj, że reCAPTCHA nie może używanych do zakończenia wczytywania. Na przykład poniższy kod byłby prawdopodobnie przerwa:
<script async src="https://www.google.com/recaptcha/api.js"></script>
<script>
// If reCAPTCHA is still loading, grecaptcha will be undefined.
grecaptcha.ready(function(){
grecaptcha.render("container", {
sitekey: "ABC-123"
});
});
</script>
W niektórych sytuacjach dostosowanie kolejności skryptów może wystarczyć, aby zapobiec wyścigowi
warunków. Możesz też zapobiec warunkom wyścigu, dodając
ten fragment kodu na stronach, które wczytują reCAPTCHA. Jeśli używasz
grecaptcha.ready()
, aby opakowywać wywołania interfejsu API, dodaj ten fragment kodu, aby mieć pewność,
który można w każdej chwili wywołać.
<script async src="https://www.google.com/recaptcha/api.js"></script>
<script>
// How this code snippet works:
// This logic overwrites the default behavior of `grecaptcha.ready()` to
// ensure that it can be safely called at any time. When `grecaptcha.ready()`
// is called before reCAPTCHA is loaded, the callback function that is passed
// by `grecaptcha.ready()` is enqueued for execution after reCAPTCHA is
// loaded.
if(typeof grecaptcha === 'undefined') {
grecaptcha = {
ready: function(cb) {
// window.__grecaptcha_cfg is a global variable that stores reCAPTCHA's
// configuration. By default, any functions listed in its 'fns' property
// are automatically executed when reCAPTCHA loads.
const c = '___grecaptcha_cfg';
window[c] = window[c] || {};
(window[c]['fns'] = window[c]['fns'] || []).push(cb);
}
};
}
// Usage
grecaptcha.ready(function(){
grecaptcha.render("container", {
sitekey: "ABC-123"
});
});
</script>
Alternatywnie witryny korzystające z interfejsu API w wersji 2 mogą używać interfejsu API w wersji 2
wywołanie zwrotne onload
; po zakończeniu reCAPTCHA wykonywane jest wywołanie zwrotne onload
wczytuję. Przed wczytaniem reCAPTCHA należy zdefiniować wywołanie zwrotne onload
skrypt.
<script>
const onloadCallback = function() {
console.log("reCAPTCHA has loaded!");
grecaptcha.reset();
};
</script>
<script async src="https://www.google.com/recaptcha/api.js?onload=onloadCallback”></script>
Jeśli asynchroniczne ładowanie reCAPTCHA nie jest możliwe, w tym: preconnect
wskazówki dotyczące zasobów dla reCAPTCHA są zdecydowanie zalecane. Pozwoli to zminimalizować
czas, przez jaki pobrany skrypt blokuje parser.
Korzystanie ze wskazówek dotyczących zasobów
Umieszczenie poniższych wskazówek dotyczących zasobów w pliku <head>
dokumentu spowoduje,
i skrócić czas potrzebny na dostarczenie zasobów zużywanych przez
reCAPTCHA. Wskazówka dotycząca zasobu preconnect
instruuje przeglądarkę, aby ustanowiła
wcześniejszego połączenia z innym źródłem.
<link rel="preconnect" href="https://www.google.com">
<link rel="preconnect" href="https://www.gstatic.com" crossorigin>
Leniwe ładowanie
Ogólnie rzecz biorąc, im szerszy kontekst dla strony ma reCAPTCHA, tym lepiej ma na celu ustalenie, czy działania użytkownika są dozwolone. To jest zwłaszcza w przypadku korzystania z wersji reCAPTCHA, które nie wymagają od użytkownika, . Dlatego oczekiwanie na wczytanie reCAPTCHA do określonego ograniczonego działania (np. przesłanie formularza) zwykle nie jest zalecane.