1

在我的扩展中,我将消息从我传递background.jscontent.jsusing 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://*/*']});
4

0 回答 0