Đang tải reCAPTCHA

Tài liệu này thảo luận các phương pháp hay nhất để tải thẻ tập lệnh reCAPTCHA. Thông tin này áp dụng cho cả reCAPTCHA v2 và v3.

Tải reCAPTCHA không đồng bộ

Bạn có thể tải không đồng bộ tất cả các phiên bản của reCAPTCHA. Việc tải reCAPTCHA không đồng bộ không ảnh hưởng đến khả năng xác định lưu lượng truy cập đáng ngờ. Do các lợi ích về hiệu suất của tập lệnh không đồng bộ, bạn nên tải reCAPTCHA không đồng bộ.

<script async src="https://www.google.com/recaptcha/api.js">

Khi tải reCAPTCHA không đồng bộ, hãy lưu ý rằng bạn không thể tải reCAPTCHA được sử dụng cho đến khi tải xong. Ví dụ: mã sau đây có thể ngắt:

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

Trong một số trường hợp, việc điều chỉnh thứ tự tập lệnh có thể đủ để ngăn chặn tình trạng tương tranh. Ngoài ra, bạn có thể ngăn tình trạng tương tranh bằng cách thêm đoạn mã sau vào các trang tải reCAPTCHA. Nếu bạn đang sử dụng grecaptcha.ready() để gói các lệnh gọi API, hãy thêm đoạn mã sau đây để đảm bảo reCAPTCHA có thể được gọi bất cứ lúc nào.

<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 = {};
  }
  grecaptcha.ready = function(cb){
    if(typeof grecaptcha === 'undefined') {
      // 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);
    } else {
      cb();
    }
  }

  // Usage
  grecaptcha.ready(function(){
    grecaptcha.render("container", {
      sitekey: "ABC-123"
    });
  });
</script>

Ngoài ra, các trang web sử dụng API v2 có thể thấy hữu ích khi sử dụng lệnh gọi lại onload; lệnh gọi lại onload được thực thi khi reCAPTCHA kết thúc đang tải. Bạn phải xác định lệnh gọi lại onload trước khi tải reCAPTCHA tập lệnh.

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

Nếu không thể tải reCAPTCHA không đồng bộ, bạn nên thêm gợi ý tài nguyên preconnect cho reCAPTCHA. Điều này sẽ giảm thiểu thời gian tải tập lệnh xuống chặn trình phân tích cú pháp.

Sử dụng gợi ý tài nguyên

Việc đưa các gợi ý tài nguyên sau đây vào <head> của tài liệu sẽ giảm lượng thời gian cần thiết để phân phối tài nguyên mà reCAPTCHA. Gợi ý về tài nguyên preconnect hướng dẫn trình duyệt thiết lập kết nối sớm với nguồn gốc của bên thứ ba.

<link rel="preconnect" href="https://www.google.com">
<link rel="preconnect" href="https://www.gstatic.com" crossorigin>

Tải từng phần

Nói chung, reCAPTCHA có càng nhiều ngữ cảnh về một trang thì càng tốt là xác định xem hành động của người dùng có hợp lệ hay không. Đây là đặc biệt đúng khi sử dụng các phiên bản reCAPTCHA không phụ thuộc vào người dùng thách thức. Do đó, bạn không nên đợi tải reCAPTCHA cho đến khi một hành động bị hạn chế cụ thể xảy ra (ví dụ: gửi biểu mẫu).