Chrome扩展程序onMessage

时间:2015-08-18 06:34:42

标签: javascript google-chrome-extension

我的background.js中有以下代码:

chrome.webRequest.onHeadersReceived.addListener(function(details){
    if(isfileTypeXYZ(details))
    {   
        chrome.tabs.sendMessage(details.tabId, {isFileXYZ: true});
        return { //Stop rendering of frame...
        responseHeaders: [{
          name: 'X-Content-Type-Options', 
          value: 'nosniff'
        }, {
          name: 'X-Frame-Options', 
          value: 'deny'
        }]
      };
    }
}, {
   urls: ['*://*/*'],
   types: ['main_frame']
}, ['blocking', 'responseHeaders']);

在我的脚本中,我有以下代码:

var toLoadXYZ = 0;
chrome.runtime.onMessage.addListener(function(msg, _, sendMessage){
    if(msg.isFileXYZ)
    {
        toLoadXYZ = 1;
    }
});

$(document).ready(function(){
    alert(toLoadXYZ);
});

我想要做的是检测是否正在打开特定文件类型,然后从系统自身运行的服务器加载图像并显示它。我将不得不使用xhr加载图像,但我需要首先使这个检测工作正常。我面临两个问题:

  1. 首次加载网址时不会触发onMessage - 之后是(使用F5刷新)。
  2. alert(toLoadXYZ)中显示的值为0而不是1,即使调试器显示触发了onMessage(首次加载后 - 首次加载后我使用F5刷新页面)。
  3. 如果您想参考,这是清单文件:

    {
        "manifest_version": 2,
    
        "name": "my Extension",
        "version": "1.0",
    
        "background": {
            "scripts": ["background.js"],
            "persistent": true
        },
    
        "permissions": [
            "webRequest",
            "<all_urls>",
            "webRequestBlocking",
            "tabs",
            "webNavigation"
        ],
        "content_scripts": [
        {
          "matches": ["<all_urls>"],
          "js": ["jquery-2.1.4.min","renderXYZ.js"]
        }
      ],
        "web_accessible_resources": [ "http:/*", "https:/*", "ftp:/*", "file:/*", "chrome-extension:/*"]
    }
    

    这个问题的原因是什么?怎么解决?我搜索了很多没有得到任何有用的请帮助!!

    更新

    function findContentType(responseHeaders)
    {
        for(var i = 0; i < responseHeaders.length; i++)
        {
            var header = responseHeaders[i];
            if(header.name.toLowerCase() === "content-type")
                return header.value.toLowerCase();
        }
        return "";
    }
    
    function isfileTypeXYZ(details)
    {
        var contentType = findContentType(details.responseHeaders);
        if(contentType === "some-mime-type-here")
        {
            return true;
        }
        return false;
    }
    

1 个答案:

答案 0 :(得分:2)

正在调用

chrome.runtime.onMessage,但它在之前请求的内容脚本上被调用。由于您正在刷新页面,因此tabId不会更改,因此您可以在新主体加载之前将消息发送到上一页的内容脚本,这就是您的原因所在&#0} #39;看到这种行为。也许更清楚:

  1. 第一次网址调用。
  2. onHeadersReceived被称为
  3. 您致电chrome.tabs.sendMessage但由于尚未加载内容脚本,因此无法触发任何内容。
  4. 该选项卡加载请求正文和内容脚本。文档就绪被调用。
  5. 您刷新标签。 onHeadersReceived会调用此新请求,但该选项卡的内容仍然是上一个请求的内容。您可以在此处看到提醒以及toLoadXYZ为0的原因。