在我的扩展程序中,我使用background.js
将消息从content.js
传递到chrome.tabs.sendMessage
。对于有效的tabId
(我打印其值,非负值),有时内容会在background.js
中的警报之后打印警报,但不是大多数时间。这是示例代码。我在代码中遗漏了什么吗?我希望,每次在background.js
中显示提醒时,content.js
都必须有提醒。我正在处理请求并且页面尚未完全显示时发送消息。
background.js
...
if(url == "http://example.com"){
alert("In background");
chrome.tabs.sendMessage(tabId, {msg: "HELLO"});
}
...
content.js
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
alert("In content");
});
的manifest.json
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": ["content.js"],
"all_frames": true,
"run_at": "document_end"
}
],
已添加
只是提醒您,我想在第一次请求后将DOM中的图像URL更改为http(从http强制重定向到http),重定向到onBeforeRquest
中的https,失败。这不起作用,因为我意识到内容脚本没有收到所有消息。作为以下代码中的简单测试,我希望每次打印消息“In onError20ccurred”时,它必须在控制台后面跟着“In content”,但它不能以这种方式工作。欢迎任何建议。我首先确认内容是否准备就绪,然后发送消息。这是代码:
content.js:
chrome.extension.sendRequest({contentStatus: "activated"});
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
console.log(request.srcurl); //or console.log("In content");
});
background.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://*/*']});