内容脚本在弹出消息上回答两次 - Chrome扩展程序

时间:2014-07-03 16:47:44

标签: javascript google-chrome google-chrome-extension background

我得到了结果,但它返回了两个警告“内容:这是一个测试”但在脚本中我只发送了1个帖子。 它完美无缺,但两个答案太烦人了。请帮助。

清单:

 {
"name": "Test",
"version": "1.0",
"manifest_version": 2,
"description": "Test",
"background": {
    "scripts": ["event.js"],
    "persistent": true
 }, 
"content_security_policy": "script-src 'self' 'unsafe-eval';  object-src 'self'",
"permissions": [ "tabs", "http://*/*", "https://*/*" ],
"content_scripts": [
    {
        "matches": ["http://*/*", "https://*/*"],
             "js": ["content.js"],
         "run_at": "document_end",
     "all_frames": true
    }
], 
"browser_action": {
            "name": "Do Action",
    "default_icon": "icon.png",
    "default_popup": "popup.html"
}}

弹出式script.js:

    $("#myButton").click(function(){    


             chrome.tabs.getSelected(null, function(tab) 
             {      
                      chrome.tabs.executeScript(tab.id, { file: "content.js" }, function() 
                      {
                              var port = chrome.tabs.connect(tab.id, { name: "port-conn" });
                              port.postMessage({ data: "This is a test" });
                              port.onMessage.addListener(function (msg) 
                              {
                                    alert("Content: " + msg.answer);
                              });
                     });
             });
  }...

content.js:

chrome.extension.onConnect.addListener(function(port) { 
port.onMessage.addListener(function(msg) { 
    port.postMessage({answer: msg.data});
}); 

});

2 个答案:

答案 0 :(得分:1)

首先在清单中指定

Content.js,以便在加载扩展程序时加载它。然后你通过executeScript使用它,所以它第二次运行。 做这些改变。

弹出式script.js:

    chrome.tabs.getSelected(null, function(tab){                                      
    var port = chrome.tabs.connect(tab.id, { name: "port-conn" });
    port.onMessage.addListener(function (msg) 
         {
             alert("Content: " + msg.answer);
         });
    $("#myButton").click(function(){    
         port.postMessage({ data: "This is a test" });
    });
});

这就是消息传递的重点。如果它不起作用,那么您必须使用BACKGROUND SCRIPT,以便在contentpopup之间转发消息

答案 1 :(得分:-1)

问题解决了。

在清单

"content_scripts": [
{
    "matches": ["http://*/*", "https://*/*"],
         "js": ["content.js"],
     "run_at": "document_end",
 "all_frames": true
}

],

它在每个页面上运行content.js并且

{ file: "content.js" }

在活动标签中再次运行它。这就是为什么一个标签会运行两次内容。