กําลังโหลด reCAPTCHA

เอกสารนี้กล่าวถึงแนวทางปฏิบัติแนะนำในการโหลดแท็กสคริปต์ reCAPTCHA ข้อมูลนี้ใช้ได้กับทั้ง reCAPTCHA v2 และ v3

กำลังโหลด reCAPTCHA แบบไม่พร้อมกัน

reCAPTCHA ทุกเวอร์ชันสามารถโหลดแบบไม่พร้อมกัน กำลังโหลด reCAPTCHA แบบไม่พร้อมกันไม่ได้ส่งผลกระทบต่อความสามารถในการระบุการเข้าชมที่น่าสงสัย ครบกำหนด ถึงประโยชน์ด้านประสิทธิภาพของสคริปต์แบบไม่พร้อมกัน การโหลด reCAPTCHA โดยทั่วไปมักจะแนะนำให้ใช้แบบอะซิงโครนัส

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

เมื่อโหลด reCAPTCHA แบบไม่พร้อมกัน โปรดทราบว่าคุณจะใช้ reCAPTCHA ได้จนกว่าระบบจะโหลดเสร็จ ตัวอย่างเช่น โค้ดต่อไปนี้มีแนวโน้มที่จะหยุดทำงาน

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

ในบางสถานการณ์ การปรับลําดับสคริปต์อาจเพียงพอที่จะป้องกันเงื่อนไขการแข่งขัน นอกจากนี้ คุณยังป้องกันเงื่อนไขในการแข่งขันได้โดยใส่ ข้อมูลโค้ดต่อไปนี้ในหน้าที่โหลด reCAPTCHA หากคุณกำลังใช้ grecaptcha.ready() เพื่อรวมการเรียก API ให้เพิ่มข้อมูลโค้ดต่อไปนี้เพื่อให้ เรียกใช้ reCAPTCHA ได้ทุกเมื่อ

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

หรือเว็บไซต์ที่ใช้ v2 API อาจพบว่าการใช้การเรียกคืน onload มีประโยชน์ การเรียกคืน onload จะทำงานเมื่อ reCAPTCHA โหลดเสร็จ คุณควรกำหนดการเรียกกลับ onload ก่อนโหลดสคริปต์ reCAPTCHA

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

หากการโหลด reCAPTCHA แบบไม่พร้อมกันไม่ใช่ตัวเลือกที่เป็นไปได้ เราขอแนะนําอย่างยิ่งให้ใส่preconnect คำแนะนำทรัพยากรสําหรับ reCAPTCHA ซึ่งจะช่วยลดเวลาที่การดาวน์โหลดสคริปต์บล็อกโปรแกรมแยกวิเคราะห์

การใช้คำแนะนำเกี่ยวกับทรัพยากร

การรวมคำแนะนำด้านทรัพยากรต่อไปนี้ไว้ใน <head> ของเอกสารจะ ลดระยะเวลาที่ใช้ในการส่งมอบทรัพยากรที่ reCAPTCHA คำแนะนำของทรัพยากร preconnect จะแนะนำเบราว์เซอร์ให้สร้าง การเชื่อมต่อกับต้นทางของบุคคลที่สามตั้งแต่เนิ่นๆ

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

การโหลดแบบ Lazy Loading

โดยทั่วไป ยิ่งมีบริบทเกี่ยวกับหน้าเว็บ reCAPTCHA มากเท่าใดก็ยิ่งดี เพื่อพิจารณาว่าการดำเนินการของผู้ใช้นั้นถูกต้องตามกฎหมายหรือไม่ ซึ่งกรณีนี้มักจะเกิดขึ้นเมื่อใช้ reCAPTCHA เวอร์ชันที่ไม่อาศัยการทดสอบผู้ใช้ ดังนั้น กำลังรอโหลด reCAPTCHA จนกว่าจะมีการดำเนินการที่ถูกจำกัดที่เจาะจง เกิดขึ้น (เช่น การส่งแบบฟอร์ม) โดยทั่วไปจะไม่แนะนำ