Скрипт содержимого дважды отвечает на всплывающее сообщение — Расширения Chrome

#javascript #google-chrome #google-chrome-extension #background

#javascript #google-chrome #google-chrome-extension #предыстория

Вопрос:

Я получил результат, но он возвращает два предупреждения «Содержимое: это тест», но в скриптах я отправляю только 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});
}); 
  

});

Ответ №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 скрипт, который просто пересылает сообщение между content и popup

Комментарии:

1. Также следует отметить: "all_frames": true вызовет столько вставок, сколько фреймов в документе, и может привести к аналогичным симптомам.

Ответ №2:

Проблема решена.

В манифесте

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

],

он запускается content.js на каждой странице и

 { file: "content.js" }
  

Запустите его снова на активной вкладке. Вот почему на одной вкладке содержимое запускается дважды.