คำอธิบาย
ใช้ chrome.scripting
API เพื่อเรียกใช้สคริปต์ในบริบทต่างๆ
สิทธิ์
scripting
ความพร้อมใช้งาน
ไฟล์ Manifest
หากต้องการใช้ chrome.scripting
API ให้ประกาศสิทธิ์ "scripting"
ในไฟล์ Manifest บวกกับสิทธิ์โฮสต์สำหรับหน้าที่จะแทรกสคริปต์ ใช้คีย์ "host_permissions"
หรือสิทธิ์ "activeTab"
ซึ่งจะให้สิทธิ์โฮสต์ชั่วคราว ตัวอย่างต่อไปนี้ใช้สิทธิ์ ActiveTab
{
"name": "Scripting Extension",
"manifest_version": 3,
"permissions": ["scripting", "activeTab"],
...
}
แนวคิดและการใช้งาน
คุณใช้ chrome.scripting
API เพื่อแทรก JavaScript และ CSS ลงในเว็บไซต์ได้ ซึ่งคล้ายกับสิ่งที่คุณทำได้ด้วยสคริปต์เนื้อหา แต่การใช้เนมสเปซ chrome.scripting
จะทำให้ส่วนขยายตัดสินใจได้ในระหว่างรันไทม์
เป้าหมายการแทรก
คุณสามารถใช้พารามิเตอร์ target
เพื่อระบุเป้าหมายที่จะแทรก JavaScript หรือ CSS
ช่องที่ต้องกรอกเพียงช่องเดียวคือ tabId
โดยค่าเริ่มต้น การแทรกจะทำงานในเฟรมหลักของแท็บที่ระบุ
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
files : [ "script.js" ],
})
.then(() => console.log("script injected"));
หากต้องการเรียกใช้ในเฟรมทั้งหมดของแท็บที่ระบุ คุณสามารถตั้งค่าบูลีน allFrames
เป็น true
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
files : [ "script.js" ],
})
.then(() => console.log("script injected in all frames"));
คุณยังแทรกลงในเฟรมที่เฉพาะเจาะจงของแท็บได้โดยการระบุรหัสเฟรมแต่ละรายการ ดูข้อมูลเพิ่มเติมเกี่ยวกับรหัสเฟรมได้ที่ chrome.webNavigation
API
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), frameIds : [ frameId1, frameId2 ]},
files : [ "script.js" ],
})
.then(() => console.log("script injected on target frames"));
แทรกโค้ดแล้ว
ส่วนขยายสามารถระบุโค้ดที่จะแทรกผ่านไฟล์ภายนอกหรือตัวแปรรันไทม์
Files
โดยไฟล์จะระบุเป็นสตริงซึ่งเป็นเส้นทางที่เกี่ยวข้องกับไดเรกทอรีรากของส่วนขยาย โค้ดต่อไปนี้จะแทรกไฟล์ script.js
ลงในเฟรมหลักของแท็บ
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
files : [ "script.js" ],
})
.then(() => console.log("injected script file"));
ฟังก์ชันรันไทม์
เมื่อแทรก JavaScript ด้วย scripting.executeScript()
คุณระบุฟังก์ชันที่จะดำเนินการแทนไฟล์ได้ ฟังก์ชันนี้ควรเป็นตัวแปรฟังก์ชันที่ใช้ได้กับบริบทส่วนขยายปัจจุบัน
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : getTitle,
})
.then(() => console.log("injected a function"));
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor() {
document.body.style.backgroundColor = getUserColor();
}
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : changeBackgroundColor,
})
.then(() => console.log("injected a function"));
คุณแก้ไขปัญหานี้ได้โดยใช้พร็อพเพอร์ตี้ args
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor(backgroundColor) {
document.body.style.backgroundColor = backgroundColor;
}
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : changeBackgroundColor,
args : [ getUserColor() ],
})
.then(() => console.log("injected a function"));
สตริงรันไทม์
หากแทรก CSS ภายในหน้าเว็บ คุณจะระบุสตริงที่จะใช้ในพร็อพเพอร์ตี้ css
ได้ด้วย ตัวเลือกนี้มีให้สำหรับ scripting.insertCSS()
เท่านั้น คุณไม่สามารถเรียกใช้สตริงโดยใช้ scripting.executeScript()
function getTabId() { ... }
const css = "body { background-color: red; }";
chrome.scripting
.insertCSS({
target : {tabId : getTabId()},
css : css,
})
.then(() => console.log("CSS injected"));
จัดการผลลัพธ์
ระบบจะส่งผลลัพธ์ของการเรียกใช้ JavaScript ไปยังส่วนขยาย ผลลัพธ์เดียวจะรวม ต่อเฟรมด้วย เฟรมหลักจะเป็นดัชนีแรกในอาร์เรย์ผลลัพธ์ ส่วนเฟรมอื่นๆ ทั้งหมดจะอยู่ในลำดับที่ไม่กำหนด
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
func : getTitle,
})
.then(injectionResults => {
for (const {frameId, result} of injectionResults) {
console.log(`Frame ${frameId} result:`, result);
}
});
scripting.insertCSS()
ไม่แสดงผลลัพธ์ใดๆ
คำมั่นสัญญา
หากผลที่ได้จากการดำเนินการสคริปต์เป็นที่น่าพอใจ Chrome จะรอให้คำสัญญาดังกล่าวจบลงแล้วจึงนำผลลัพธ์กลับมา
function getTabId() { ... }
async function addIframe() {
const iframe = document.createElement("iframe");
const loadComplete =
new Promise(resolve => iframe.addEventListener("load", resolve));
iframe.src = "https://example.com";
document.body.appendChild(iframe);
await loadComplete;
return iframe.contentWindow.document.title;
}
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
func : addIframe,
})
.then(injectionResults => {
for (const frameResult of injectionResults) {
const {frameId, result} = frameResult;
console.log(`Frame ${frameId} result:`, result);
}
});
ตัวอย่าง
ยกเลิกการลงทะเบียนสคริปต์เนื้อหาแบบไดนามิกทั้งหมด
ข้อมูลโค้ดต่อไปนี้มีฟังก์ชันที่ยกเลิกการลงทะเบียนสคริปต์เนื้อหาแบบไดนามิกทั้งหมดที่ส่วนขยายเคยลงทะเบียนไว้
async function unregisterAllDynamicContentScripts() {
try {
const scripts = await chrome.scripting.getRegisteredContentScripts();
const scriptIds = scripts.map(script => script.id);
return chrome.scripting.unregisterContentScripts(scriptIds);
} catch (error) {
const message = [
"An unexpected error occurred while",
"unregistering dynamic content scripts.",
].join(" ");
throw new Error(message, {cause : error});
}
}
หากต้องการลองใช้ chrome.scripting
API ให้ติดตั้งตัวอย่างสคริปต์จากที่เก็บตัวอย่างส่วนขยาย Chrome
ประเภท
ContentScriptFilter
พร็อพเพอร์ตี้
-
ids
string[] ไม่บังคับ
หากระบุไว้
getRegisteredContentScripts
จะส่งกลับสคริปต์ที่มีรหัสที่ระบุไว้ในรายการนี้เท่านั้น
CSSInjection
พร็อพเพอร์ตี้
-
css
string ไม่บังคับ
สตริงที่มี CSS ที่จะแทรก ต้องระบุ
files
และcss
อย่างใดอย่างหนึ่ง -
files
string[] ไม่บังคับ
เส้นทางของไฟล์ CSS ที่จะแทรก ซึ่งเกี่ยวข้องกับไดเรกทอรีรากของส่วนขยาย ต้องระบุ
files
และcss
อย่างใดอย่างหนึ่ง -
ต้นกำเนิด
StyleOrigin ไม่บังคับ
ต้นทางรูปแบบสำหรับการแทรก ค่าเริ่มต้นคือ
'AUTHOR'
-
เป้าหมาย
รายละเอียดที่ระบุเป้าหมายที่จะแทรก CSS
ExecutionWorld
โลกของ JavaScript สำหรับสคริปต์ที่เรียกใช้ภายใน
ค่าแจกแจง
"ISOLATED"
ระบุโลกที่อยู่ที่แยก (Isolated World) ซึ่งเป็นสภาพแวดล้อมการดำเนินการที่มีเอกลักษณ์เฉพาะของส่วนขยายนี้
"MAIN"
ระบุโลกหลักของ DOM ซึ่งเป็นสภาพแวดล้อมการดำเนินการที่แชร์กับ JavaScript ของหน้าโฮสต์
InjectionResult
พร็อพเพอร์ตี้
-
documentId
string
Chrome 106 ขึ้นไปเอกสารที่เกี่ยวข้องกับการแทรก
-
frameId
ตัวเลข
Chrome 90 ขึ้นไปเฟรมที่เชื่อมโยงกับการแทรก
-
ผลลัพธ์
รายการใดก็ได้ ไม่บังคับ
ผลของการเรียกใช้สคริปต์
InjectionTarget
พร็อพเพอร์ตี้
-
allFrames
บูลีน ไม่บังคับ
สคริปต์ควรแทรกลงในเฟรมทั้งหมดภายในแท็บหรือไม่ ค่าเริ่มต้นคือ "เท็จ" ค่านี้ต้องไม่เป็นจริงหากระบุ
frameIds
ไว้ -
documentIds
string[] ไม่บังคับ
Chrome 106 ขึ้นไปID ของ documentId ที่เฉพาะเจาะจงที่จะแทรก ต้องไม่ตั้งค่านี้หากมีการตั้งค่า
frameIds
-
frameIds
number[] ไม่บังคับ
รหัสของเฟรมที่เฉพาะเจาะจงที่จะแทรก
-
tabId
ตัวเลข
รหัสของแท็บที่จะแทรก
RegisteredContentScript
พร็อพเพอร์ตี้
-
allFrames
บูลีน ไม่บังคับ
หากระบุ "จริง" ระบบจะแทรกลงในเฟรมทั้งหมด แม้ว่าเฟรมจะไม่ใช่เฟรมบนสุดในแท็บก็ตาม แต่ละเฟรมจะได้รับการตรวจสอบแยกกันสำหรับข้อกำหนด URL โดยจะไม่แทรกลงในเฟรมย่อยหากไม่เป็นไปตามข้อกำหนด URL ค่าเริ่มต้นคือ false ซึ่งหมายความว่าระบบจับคู่เฉพาะเฟรมด้านบนเท่านั้น
-
css
string[] ไม่บังคับ
รายการไฟล์ CSS ที่จะแทรกในหน้าที่ตรงกัน แทรกพารามิเตอร์เหล่านี้ตามลำดับที่ปรากฏในอาร์เรย์นี้ ก่อนที่จะมีการสร้างหรือแสดง DOM สำหรับหน้าเว็บ
-
excludeMatches
string[] ไม่บังคับ
ยกเว้นหน้าที่ระบบอาจแทรกสคริปต์เนื้อหานี้เข้าไป ดูรายละเอียดเพิ่มเติมเกี่ยวกับไวยากรณ์ของสตริงเหล่านี้ที่การจับคู่รูปแบบ
-
id
string
รหัสของสคริปต์เนื้อหาที่ระบุในการเรียก API ต้องไม่ขึ้นต้นด้วย '_' เนื่องจากระบบสงวนไว้เป็นคำนำหน้าสำหรับรหัสสคริปต์ที่สร้างขึ้น
-
js
string[] ไม่บังคับ
รายการไฟล์ JavaScript ที่จะแทรกในหน้าที่ตรงกัน ระบบจะแทรกแท็กเหล่านี้ตามลำดับที่ปรากฏในอาร์เรย์นี้
-
matchOriginAsFallback
บูลีน ไม่บังคับ
Chrome 119 ขึ้นไประบุว่าสามารถแทรกสคริปต์ลงในเฟรมที่ URL มีรูปแบบที่ไม่รองรับได้หรือไม่ โดยเฉพาะ: about:, data:, blob: หรือ filesystem: ในกรณีเช่นนี้ ระบบจะตรวจสอบต้นทางของ URL เพื่อพิจารณาว่าควรแทรกสคริปต์หรือไม่ หากต้นทางคือ
null
(ตามกรณีของข้อมูล: URL) ต้นทางที่ใช้จะเป็นเฟรมที่สร้างเฟรมปัจจุบันหรือเฟรมที่เริ่มการนำทางมายังเฟรมนี้ โปรดทราบว่านี่อาจไม่ใช่เฟรมระดับบนสุด -
ตรงกัน
string[] ไม่บังคับ
ระบุหน้าที่จะแทรกสคริปต์เนื้อหานี้ ดูรายละเอียดเพิ่มเติมเกี่ยวกับไวยากรณ์ของสตริงเหล่านี้ที่การจับคู่รูปแบบ ต้องระบุสำหรับ
registerContentScripts
-
persistAcrossSessions
บูลีน ไม่บังคับ
ระบุว่าสคริปต์เนื้อหานี้จะยังคงอยู่ในเซสชันในอนาคตหรือไม่ ค่าเริ่มต้นคือ True
-
runAt
RunAt ไม่บังคับ
ระบุเวลาที่แทรกไฟล์ JavaScript ลงในหน้าเว็บ ค่าที่ต้องการและค่าเริ่มต้นคือ
document_idle
-
ต่างประเทศ
ExecutionWorld ไม่บังคับ
Chrome 102 ขึ้นไปJavaScript "world" ที่จะเรียกใช้สคริปต์ ค่าเริ่มต้นคือ
ISOLATED
ScriptInjection
พร็อพเพอร์ตี้
-
args
ทั้งหมด[] ไม่บังคับ
Chrome 92 ขึ้นไปอาร์กิวเมนต์ที่จะส่งผ่านไปยังฟังก์ชันที่ระบุ โดยจะใช้ได้เมื่อมีการระบุพารามิเตอร์
func
เท่านั้น อาร์กิวเมนต์เหล่านี้ต้องเป็นอนุกรม JSON -
files
string[] ไม่บังคับ
เส้นทางของไฟล์ JS หรือ CSS ที่จะแทรก ซึ่งเกี่ยวข้องกับไดเรกทอรีรากของส่วนขยาย ต้องระบุ
files
หรือfunc
อย่างใดอย่างหนึ่ง -
injectImmediately
บูลีน ไม่บังคับ
Chrome 102 ขึ้นไปพิจารณาว่าควรทริกเกอร์การแทรกในเป้าหมายโดยเร็วที่สุดหรือไม่ โปรดทราบว่านี่ไม่ใช่การรับประกันว่าการแทรกจะเกิดขึ้นก่อนการโหลดหน้าเว็บ เนื่องจากหน้าเว็บอาจโหลดแล้วในขณะที่สคริปต์ไปถึงเป้าหมาย
-
เป้าหมาย
รายละเอียดที่ระบุเป้าหมายที่จะแทรกสคริปต์
-
ต่างประเทศ
ExecutionWorld ไม่บังคับ
Chrome 95 ขึ้นไปJavaScript "world" ที่จะเรียกใช้สคริปต์ ค่าเริ่มต้นคือ
ISOLATED
-
func
เป็นโมฆะ ไม่บังคับ
Chrome 92 ขึ้นไปฟังก์ชัน JavaScript ที่จะแทรก ฟังก์ชันนี้จะมีการทำให้เป็นอนุกรม จากนั้นทำการดีซีเรียลไลซ์สำหรับการแทรก ซึ่งหมายความว่าพารามิเตอร์ที่ผูกไว้และบริบทการดำเนินการจะสูญหายไป ต้องระบุ
files
หรือfunc
อย่างใดอย่างหนึ่งฟังก์ชัน
func
มีลักษณะดังนี้() => {...}
StyleOrigin
ต้นทางของการเปลี่ยนแปลงรูปแบบ ดูข้อมูลเพิ่มเติมได้ที่ต้นทางของสไตล์
ค่าแจกแจง
"AUTHOR"
วิธีการ
executeScript()
chrome.scripting.executeScript(
injection: ScriptInjection,
callback?: function,
)
แทรกสคริปต์ลงในบริบทเป้าหมาย โดยค่าเริ่มต้น สคริปต์จะทํางานที่ document_idle
หรือทันทีหากโหลดหน้าเว็บแล้ว หากตั้งค่าพร็อพเพอร์ตี้ injectImmediately
ไว้ สคริปต์จะแทรกโค้ดโดยไม่ต้องรอ แม้ว่าหน้าเว็บยังโหลดไม่เสร็จก็ตาม หากสคริปต์ประเมินได้ตามที่ต้องการ เบราว์เซอร์จะรอให้คำสัญญาคงที่และแสดงผลค่าที่ได้กลับมา
พารามิเตอร์
-
ฉีด
รายละเอียดของสคริปต์ที่จะแทรก
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
มีลักษณะดังนี้(results: InjectionResult[]) => void
-
ผลการแข่งขัน
-
การคืนสินค้า
-
Promise<InjectionResult[]>
Chrome 90 ขึ้นไปManifest V3 ขึ้นไปรองรับคำสัญญา แต่จะใช้โค้ดเรียกกลับเพื่อความเข้ากันได้แบบย้อนหลัง คุณไม่สามารถใช้ทั้ง 2 ฟีเจอร์ในการเรียกใช้ฟังก์ชันเดียวกันได้ คำสัญญาจะยุติด้วยประเภทเดียวกันกับที่ส่งไปยังโค้ดเรียกกลับ
getRegisteredContentScripts()
chrome.scripting.getRegisteredContentScripts(
filter?: ContentScriptFilter,
callback?: function,
)
แสดงสคริปต์เนื้อหาที่จดทะเบียนแบบไดนามิกทั้งหมดสำหรับส่วนขยายนี้ที่ตรงกับตัวกรองที่ระบุ
พารามิเตอร์
-
ฟิลเตอร์
ContentScriptFilter ไม่บังคับ
ออบเจ็กต์เพื่อกรองสคริปต์ที่ลงทะเบียนแบบไดนามิกของส่วนขยาย
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
มีลักษณะดังนี้(scripts: RegisteredContentScript[]) => void
-
สคริปต์
-
การคืนสินค้า
-
Promise<RegisteredContentScript[]>
Manifest V3 ขึ้นไปรองรับคำสัญญา แต่จะใช้โค้ดเรียกกลับเพื่อความเข้ากันได้แบบย้อนหลัง คุณไม่สามารถใช้ทั้ง 2 ฟีเจอร์ในการเรียกใช้ฟังก์ชันเดียวกันได้ คำสัญญาจะยุติด้วยประเภทเดียวกันกับที่ส่งไปยังโค้ดเรียกกลับ
insertCSS()
chrome.scripting.insertCSS(
injection: CSSInjection,
callback?: function,
)
แทรกสไตล์ชีต CSS ลงในบริบทเป้าหมาย หากระบุหลายเฟรม ระบบจะละเว้นการแทรกที่ไม่สำเร็จ
พารามิเตอร์
-
ฉีด
รายละเอียดของรูปแบบที่จะแทรก
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
มีลักษณะดังนี้() => void
การคืนสินค้า
-
Promise<void>
Chrome 90 ขึ้นไปManifest V3 ขึ้นไปรองรับคำสัญญา แต่จะใช้โค้ดเรียกกลับเพื่อความเข้ากันได้แบบย้อนหลัง คุณไม่สามารถใช้ทั้ง 2 ฟีเจอร์ในการเรียกใช้ฟังก์ชันเดียวกันได้ คำสัญญาจะยุติด้วยประเภทเดียวกันกับที่ส่งไปยังโค้ดเรียกกลับ
registerContentScripts()
chrome.scripting.registerContentScripts(
scripts: RegisteredContentScript[],
callback?: function,
)
ลงทะเบียนสคริปต์เนื้อหาอย่างน้อยหนึ่งสคริปต์สำหรับส่วนขยายนี้
พารามิเตอร์
-
สคริปต์
มีรายการสคริปต์ที่จะลงทะเบียน หากเกิดข้อผิดพลาดระหว่างการแยกวิเคราะห์สคริปต์/การตรวจสอบไฟล์ หรือหากรหัสที่ระบุมีอยู่แล้ว ก็จะไม่มีการบันทึกสคริปต์ใดๆ
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
มีลักษณะดังนี้() => void
การคืนสินค้า
-
Promise<void>
Manifest V3 ขึ้นไปรองรับคำสัญญา แต่จะใช้โค้ดเรียกกลับเพื่อความเข้ากันได้แบบย้อนหลัง คุณไม่สามารถใช้ทั้ง 2 ฟีเจอร์ในการเรียกใช้ฟังก์ชันเดียวกันได้ คำสัญญาจะยุติด้วยประเภทเดียวกันกับที่ส่งไปยังโค้ดเรียกกลับ
removeCSS()
chrome.scripting.removeCSS(
injection: CSSInjection,
callback?: function,
)
นำสไตล์ชีต CSS ที่ส่วนขยายนี้แทรกก่อนหน้านี้ออกจากบริบทเป้าหมาย
พารามิเตอร์
-
ฉีด
รายละเอียดของรูปแบบที่จะนำออก โปรดทราบว่าพร็อพเพอร์ตี้
css
,files
และorigin
ต้องตรงกับสไตล์ชีตที่แทรกผ่านinsertCSS
ทุกประการ การพยายามลบสไตล์ชีตที่ไม่มีอยู่ไม่ใช่การดำเนินการ -
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
มีลักษณะดังนี้() => void
การคืนสินค้า
-
Promise<void>
Manifest V3 ขึ้นไปรองรับคำสัญญา แต่จะใช้โค้ดเรียกกลับเพื่อความเข้ากันได้แบบย้อนหลัง คุณไม่สามารถใช้ทั้ง 2 ฟีเจอร์ในการเรียกใช้ฟังก์ชันเดียวกันได้ คำสัญญาจะยุติด้วยประเภทเดียวกันกับที่ส่งไปยังโค้ดเรียกกลับ
unregisterContentScripts()
chrome.scripting.unregisterContentScripts(
filter?: ContentScriptFilter,
callback?: function,
)
ยกเลิกการลงทะเบียนสคริปต์เนื้อหาสำหรับส่วนขยายนี้
พารามิเตอร์
-
ฟิลเตอร์
ContentScriptFilter ไม่บังคับ
หากระบุไว้ ให้ยกเลิกการลงทะเบียนสคริปต์เนื้อหาแบบไดนามิกที่ตรงกับตัวกรองเท่านั้น มิฉะนั้น สคริปต์เนื้อหาแบบไดนามิกของส่วนขยายทั้งหมดจะถูกยกเลิกการลงทะเบียน
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
มีลักษณะดังนี้() => void
การคืนสินค้า
-
Promise<void>
Manifest V3 ขึ้นไปรองรับคำสัญญา แต่จะใช้โค้ดเรียกกลับเพื่อความเข้ากันได้แบบย้อนหลัง คุณไม่สามารถใช้ทั้ง 2 ฟีเจอร์ในการเรียกใช้ฟังก์ชันเดียวกันได้ คำสัญญาจะยุติด้วยประเภทเดียวกันกับที่ส่งไปยังโค้ดเรียกกลับ
updateContentScripts()
chrome.scripting.updateContentScripts(
scripts: RegisteredContentScript[],
callback?: function,
)
อัปเดตสคริปต์เนื้อหาอย่างน้อย 1 รายการสำหรับส่วนขยายนี้
พารามิเตอร์
-
สคริปต์
มีรายการสคริปต์ที่ต้องอัปเดต พร็อพเพอร์ตี้จะได้รับการอัปเดตสำหรับสคริปต์ที่มีอยู่เฉพาะเมื่อระบุไว้ในออบเจ็กต์นี้เท่านั้น หากมีข้อผิดพลาดระหว่างการแยกวิเคราะห์สคริปต์/การตรวจสอบไฟล์ หรือหากรหัสที่ระบุไม่ตรงกับสคริปต์ที่ลงทะเบียนโดยสมบูรณ์ แสดงว่าไม่มีการอัปเดตสคริปต์
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
มีลักษณะดังนี้() => void
การคืนสินค้า
-
Promise<void>
Manifest V3 ขึ้นไปรองรับคำสัญญา แต่จะใช้โค้ดเรียกกลับเพื่อความเข้ากันได้แบบย้อนหลัง คุณไม่สามารถใช้ทั้ง 2 ฟีเจอร์ในการเรียกใช้ฟังก์ชันเดียวกันได้ คำสัญญาจะยุติด้วยประเภทเดียวกันกับที่ส่งไปยังโค้ดเรียกกลับ