在我的扩展中,我将消息从我传递background.js
到content.js
using chrome.tabs.sendMessage
。对于有效的tabId
(我打印它的值,它的非负数),有时内容会在警报之后打印警报,background.js
但不是大多数时候。这是示例代码。我在代码中遗漏了什么吗?我期待,每次在 中显示警报时background.js
,都必须在 中出现警报content.js
。我正在处理请求并且页面尚未完全显示时发送消息。
背景.js
...
if(url == "http://example.com"){
alert("In background");
chrome.tabs.sendMessage(tabId, {msg: "HELLO"});
}
...
内容.js
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
alert("In content");
});
清单.json
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": ["content.js"],
"all_frames": true,
"run_at": "document_end"
}
],
添加
提醒您,我想在第一次请求后将 DOM 中的图像 URL 更改为 http(从 http 强制重定向到 http),重定向到 https inonBeforeRquest
失败。这不起作用,因为我意识到内容脚本没有收到所有消息。作为以下代码中的简单测试,我希望每次打印消息“In onErrorOccurred”时,它必须在控制台上跟“In content”,但它不是这样工作的。欢迎任何建议。我首先确认内容是否准备就绪,然后发送消息。这是代码:
内容.js:
chrome.extension.sendRequest({contentStatus: "activated"});
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
console.log(request.srcurl); //or console.log("In content");
});
背景.js:
var contentActive = {}
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
chrome.tabs.getSelected(null, function(tabs) {
if (request.contentStatus == "activated")
contentActive[tabs.id] = true;
});
});
chrome.webRequest.onErrorOccurred.addListener(
function(details){
if(details.type == 'image' && details.url == "https://example.com/image1.jpg") {
if(contentActive[details.tabId]){
console.log("In onErrorOccurred");
chrome.tabs.sendMessage(details.tabId, {srcurl: "In content"});
}
}
}, {urls: ['https://*/*']});