只发送一条消息,在内容页面上收到多条消息?

时间:2016-04-26 07:14:29

标签: google-chrome-extension google-chrome-devtools

当我发送消息时,即使然后四次警报正在触发! 不知道有什么不对! 我也在添加清单。

background.js:

chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
    if(request.method == "123")
    {
        chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
        chrome.tabs.sendMessage(tabs[0].id, {method: "xyz"});
            })  
    }
});

content.js:

chrome.runtime.onMessage.addListener(
    function(request) {
        alert(request.method);
        if (request.method == "xyz"){   
            alert("hello);
         }
});

这是清单文件 清单:

{
"manifest_version" : 2,
"version" : "0.1.0.0",
"name" : "xyz",
  "short_name": "xyz",
    "permissions" : ["    <all_urls>","tabs","storage","notifications","unlimitedStorage","downloads"],  

"background": {
 "scripts": ["background.js"]

  },

 "content_scripts": [{

"matches": ["<all_urls>","http://*/*","https://*/*"], 
"js": [
    "content.js",
      ],
   "all_frames" : true
 }],
"browser_action" : {
    "default_title" : "test",
    "default_popup" : "popup.html"
},
"devtools_page" : "xyz.html" 

}

1 个答案:

答案 0 :(得分:3)

您已在"all_frames": true中声明了manifest.json,这意味着您的内容脚本将被注入到您网页中的每个iframe中,然后当从后台页面发送消息时,内容脚本中的每个侦听器都会响应那个。

要解决这个问题,

  1. 删除"all_frames"部分或将其设置为false
  2. 如果您确实希望将脚本注入到框架中并且只想在顶部窗口中响应消息,则可以通过选中window !== window.top

    来检测内容脚本
    if (window !== window.top) {
        chrome.runtime.onMessage.addListener(callback);
    }
    
  3. 或者在发送邮件时排除iframe:

    chrome.tabs.sendMessage(tabs[0].id, {method: "xyz"}, {frameId: 0});