背景说明
Chrome 架构决定了「devtools ↔ 浏览器页面 JS」必须经 background + content-script 中转;
- 分 3 步
- 页面 script.js
│ postMessage
▼
- content.js
window.addEventListener(“message”, (e) => {});
│ chrome.runtime.sendMessage
▼
- DevTools Panel Page
| chrome.runtime.onMessage.addListener
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
window.postMessage( { from: "xxx", action: "your action", value: "data info", }, "*" );
window.addEventListener("message", (e) => { console.log("收到页面脚本消息", e); if (e.source !== window || !e.data.from) return; if (e.data.from === "xxx") { chrome.runtime.sendMessage({ from: e.data.from, action: e.data.action, value: e.data.value, }); } });
chrome.runtime.onMessage.addListener((message) => { const { from, action, value } = message; if (from !== "xxx") return;
if (action === "your action") { } });
|
方法 1 借助 storage 监听
- 分 4 步
- DevTools Panel Page
│ chrome.storage.local.set
▼
- background.js
chrome.storage.onChanged.addListener((changes) => {});
│ chrome.runtime.sendMessage
▼
- content.js
window.addEventListener(“message”, (e) => {});
│ chrome.runtime.sendMessage
▼
- 页面 script.js
| chrome.runtime.onMessage.addListener
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| await chrome.storage.local.set({ xxx: "xxx" });
chrome.storage.onChanged.addListener((changes) => { if (changes.yourStorageData) { chrome.tabs.query({}, (tabs) => { tabs.forEach((tab) => { if (tab.url?.startsWith("chrome-extension://")) return; if (tab.id) { chrome.tabs .sendMessage(tab.id, { from: "xxx", action: "your action", value: "data info", }) .catch((error) => { if (error.message.includes("Receiving end does not exist")) { } else { console.error(`向标签页 ${tab.id} 发送规则更新失败:`, error); } }); } }); }); } });
chrome.runtime.onMessage.addListener((data) => { const { from, action, value } = data; if (data.from !== "xxx") return; window.postMessage({ from, action, value }); });
window.addEventListener( "message", (event) => { const data = event.data; if (event.source !== window || data.from !== "xxx") return;
}, false );
|