ผู้ให้บริการส่วนขยายรองรับทั้งเหตุการณ์ Service Worker มาตรฐานและเหตุการณ์หลายรายการใน Extension API ส่วนนี้จะอธิบายสิ่งที่มีให้ใช้งานและเคล็ดลับในการใช้งาน
ประกาศเหตุการณ์ของส่วนขยาย
ตัวแฮนเดิลเหตุการณ์ใน Service Worker ต้องประกาศในสโกปส่วนกลาง ซึ่งหมายความว่าควรอยู่ในระดับบนสุดของสคริปต์และไม่ควรฝังไว้ภายในฟังก์ชัน วิธีนี้ช่วยให้มั่นใจได้ว่าระบบจะลงทะเบียนบริการดังกล่าวแบบซิงค์กันเมื่อมีการเรียกใช้สคริปต์ครั้งแรก ซึ่งจะช่วยให้ Chrome ส่งเหตุการณ์ไปยัง Service Worker ได้ทันทีที่เริ่มต้น เช่น
chrome.storage.local.get(["badgeText"], ({ badgeText }) => { chrome.action.setBadgeText({ text: badgeText }); chrome.action.onClicked.addListener(handleActionClick); });
chrome.action.onClicked.addListener(handleActionClick); chrome.storage.local.get(["badgeText"], ({ badgeText }) => { chrome.action.setBadgeText({ text: badgeText }); });
เหตุการณ์ทั่วไป
ผู้ให้บริการส่วนขยายรองรับเหตุการณ์ใน API บางรายการ ตัวอย่างที่พบบ่อยมีดังนี้ โปรดทราบว่า API บางรายการเหล่านี้ต้องใช้สิทธิ์ในการใช้งาน และ API อื่นๆ อาจมีเหตุการณ์ เมธอด หรือพร็อพเพอร์ตี้ที่ไม่พร้อมใช้งานใน Chrome บางเวอร์ชัน ดูรายละเอียดได้ในเอกสารประกอบของ API ที่ลิงก์ โดยเฉพาะเหตุการณ์ เมธอด หรือพร็อพเพอร์ตี้ที่คุณต้องการใช้
chrome.action
- เรียกให้แสดงเมื่อผู้ใช้โต้ตอบกับไอคอนแถบเครื่องมือของส่วนขยาย ไม่ว่าจะเป็นการดําเนินการกับหน้าเว็บหนึ่งๆ (แท็บ) หรือกับทั้งส่วนขยาย
chrome.management
- ระบุเหตุการณ์ที่เกี่ยวข้องกับการติดตั้ง ถอนการติดตั้ง การเปิดใช้ และการปิดใช้ส่วนขยาย
chrome.notifications
- ระบุเหตุการณ์ที่เกี่ยวข้องกับการโต้ตอบของผู้ใช้กับการแจ้งเตือนของระบบที่ส่วนขยายสร้างขึ้น
chrome.permissions
- ระบุเมื่อผู้ใช้ให้สิทธิ์หรือเพิกถอนสิทธิ์ส่วนขยาย
chrome.runtime
- ระบุเหตุการณ์ที่เกี่ยวข้องกับวงจรชีวิตของส่วนขยาย ข้อความที่ส่งจากส่วนอื่นๆ ของส่วนขยาย และการแจ้งเตือนเกี่ยวกับส่วนขยายหรืออัปเดต Chrome ที่พร้อมใช้งาน
chrome.storage.onChanged
- เรียกใช้เมื่อล้างออบเจ็กต์
StorageArea
หรือเมื่อมีการแก้ไขหรือตั้งค่าค่าของคีย์ โปรดทราบว่าอินสแตนซ์StorageArea
แต่ละรายการมีเหตุการณ์onChanged
ของตัวเอง chrome.webNavigation
- ให้ข้อมูลเกี่ยวกับสถานะคำขอการนำทางในเที่ยวบิน
ตัวกรอง
หากต้องการจํากัดเหตุการณ์ให้ใช้เฉพาะ Use Case บางรายการ หรือนําการเรียกเหตุการณ์ที่ไม่จําเป็นออก ให้ใช้ API ที่รองรับตัวกรองเหตุการณ์ ตัวอย่างเช่น ลองพิจารณาส่วนขยายที่คอยฟังเหตุการณ์ tabs.onUpdated
เพื่อตรวจหาเมื่อผู้ใช้ไปยังเว็บไซต์หนึ่งๆ ระบบจะเรียกใช้เหตุการณ์นี้ในการนําทางทุกครั้งในทุกแท็บ ให้ใช้ webNavigation.onCompleted
กับตัวกรองแทน เช่น
const filter = {
url: [
{
urlMatches: 'https://www.google.com/',
},
],
};
chrome.webNavigation.onCompleted.addListener(() => {
console.info("The user has loaded my favorite website!");
}, filter);
เหตุการณ์ของ Service Worker ของเว็บ
เจ้าหน้าที่ฝ่ายสนับสนุนด้านเทคนิคสามารถให้ความช่วยเหลือเกี่ยวกับเหตุการณ์ในวงจรของลูกค้าได้มากกว่าที่อธิบายไว้ที่อื่น
ServiceWorkerGlobal.fetch
เรียกใช้เมื่อมีการนำข้อมูลใดๆ มาจากแพ็กเกจส่วนขยาย หรือเมื่อมีเรียกใช้ fetch()
และ XMLHttpRequest()
จากสคริปต์ส่วนขยายหรือป๊อปอัป (แฮนเดิล fetch
ของ Service Worker จะไม่ขัดขวางการเรียกใช้จากสคริปต์เนื้อหา) ในกรณีหลัง คุณจะต้องเพิ่ม URL ของหน้าที่ต้องการดึงข้อมูลลงในคีย์ "host_permissions"
ใน manifest.json
ServiceWorkerGlobal.message
การส่งข้อความของ Service Worker มีให้บริการนอกเหนือจากการส่งข้อความของส่วนขยาย แต่ทั้ง 2 ระบบไม่สามารถทำงานร่วมกันได้ ซึ่งหมายความว่าข้อความที่ส่งโดยใช้ sendMessage()
(ซึ่งพร้อมใช้งานจาก API ของส่วนขยายหลายรายการ) จะไม่ถูกขัดขวางโดยตัวแฮนเดิลข้อความของ Service Worker ในทำนองเดียวกัน ข้อความที่ส่งโดยใช้ postMessage()
จะไม่ถูกขัดขวางโดยตัวแฮนเดิลข้อความของส่วนขยาย ตัวแฮนเดิลข้อความทั้ง 2 ประเภท ซึ่งก็คือ ServiceWorkerGlobal.message
และ chrome.runtime.onMessage
ได้รับการรองรับในเวิร์กเกอร์บริการของส่วนขยาย
คุณควรใช้การรับส่งข้อความของเวิร์กชีต เว้นแต่จะมีเหตุผลเฉพาะในการใช้การรับส่งข้อความของ Service Worker