ส่งข้อมูลบีคอนใน Chrome 39

Ewa Gasperowicz

บางครั้งการส่งข้อมูลจากหน้าเว็บไปยังเว็บเซิร์ฟเวอร์ก็มีประโยชน์โดยไม่ต้องรอการตอบกลับ เช่น เราอาจต้องการส่งข้อมูลวิเคราะห์ หรือข้อมูลการวินิจฉัยก่อนที่ผู้ใช้จะออกจากหน้าเว็บ

โดยปกติแล้ว การส่งข้อมูลก่อนการออกจะเกี่ยวข้องกับการฟังเหตุการณ์ unload เนื่องจากการส่งคำขอก่อนหน้านี้จะทำให้ข้อมูลไม่สมบูรณ์ เช่น เราอาจพลาดคลิกที่เกิดขึ้นก่อนออก แต่มีสิ่งที่ต้องตระหนักคือคำขอที่ส่งในตัวแฮนเดิลการยกเลิกการโหลดจะต้องเป็นแบบซิงโครนัส เนื่องจากเบราว์เซอร์ส่วนใหญ่มักไม่สนใจ XMLHttpRequest แบบไม่พร้อมกันที่สร้างขึ้นในเครื่องจัดการการยกเลิกการโหลด วิธีนี้ทำให้การนำทางช้าลง เนื่องจากผู้ใช้ต้องรอให้คำขอกลับมาก่อนจึงจะแสดงหน้าใหม่ได้

Beacon API แก้ปัญหานี้โดยให้คุณส่งคำขอ HTTP แบบไม่พร้อมกันด้วยเพย์โหลดข้อมูลขนาดเล็กจากเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์ โดยไม่ทำให้โค้ดอื่นๆ ในเหตุการณ์ยกเลิกการโหลดของหน้าเว็บล่าช้าหรือส่งผลต่อประสิทธิภาพของการนำทางหน้าถัดไป

เมธอด navigator.sendBeacon() จะจัดคิวข้อมูลที่จะส่งโดยเบราว์เซอร์โดยเร็วที่สุด แต่จะไม่ทำให้การนำทางช้าลง และแสดงผล true หากเบราว์เซอร์จัดคิวข้อมูลสำหรับการโอนได้สำเร็จ มิเช่นนั้น ระบบจะแสดงผล false

สมมติว่าเรามีปลายทางเซิร์ฟเวอร์ที่พร้อมสำหรับการรับข้อมูลบีคอนจากหน้าเว็บของเราที่ที่อยู่นี้:

https://putsreq.herokuapp.com/Dt7t2QzUkG18aDTMMcop

หากเราเพิ่มเมธอด sendBeacon() ในเครื่องจัดการเหตุการณ์ pagehide ปลายทางจะได้รับข้อมูลเมื่อผู้ใช้ออกจากหน้าเว็บ ดังนี้

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

หรือจะไปที่หน้าตรวจสอบ PutsReq เพื่อดูว่าได้รับข้อมูลบีคอนหรือไม่

นอกจากนี้ ยังมีองค์ประกอบที่กำหนดเองของ Polymer ที่ช่วยให้คุณส่งข้อมูลบีคอนได้ - <beacon-send> ลองดูได้ที่ ebidel.github.io/beacon-send