2015-05-15 10 views
0

У меня есть мой pop-up script для chrome-extension, который подсчитывает слова на странице. Поэтому, когда я нажимаю на значок панели инструментов плагина, он начинает загрузку и отправляет сообщение в content-script, в свою очередь, что content-script отвечает на информацию о количестве слов на странице.Popup-script в chrome extension отправляет сообщения несколько раз

var Popup = (function() { 
    function Popup() { 
     chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { 
      var message = {}; 
      chrome.tabs.sendMessage(tabs[0].id, message, function (response) { 
       alert("!"); // I can see this alert many times (1..4) 
        var count = response.data; 
        if (count != 1) { 
         document.getElementById("word-count").innerText = count; 
        } 
      }); 
     }); 
    } 
    return Popup; 
})(); 
new Popup(); 

Проблема заключается в том, что sendMessage является вызовом несколько раз (когда сам всплывающий сценарий загрузки себя только один раз).

Иногда он вызывает sendMessage 1 раз, иногда 2,3,4, но для некоторых страниц (например, сайт переполнения стека) только один раз.

Вопрос: Интересно, почему я мог случиться?

UPDATE:

FYI: У меня есть разрешение только для одного/активной вкладки, здесь вещи в моем manifest.json:

"permissions": [ 
    "<all_urls>", 
    "activeTab", 
    "storage" 
    ] 

Содержание раздела сценария:

"content_scripts": [ 
    { 
     "matches": ["*://*/*"], 
     "css": ["css/content.css"], 
     "all_frames" : true, 
     "js": [ 

     "lib/jquery/jquery.min.js", 
     "lib/jquery/jquery.min.map", 

     "src/msg/IMessage.js", 
     "src/msg/IMessage.ts", 


     "src/content/IFrame.js", 
     "src/content/IFrame.ts", 
     "src/content/Content.js" 
     ] 
    } 
    ], 
+0

Количество раз коррелирует с количеством открываемых вкладок –

+0

Я думаю, что это зависит, но это не правило. Даже когда одна вкладка открыта, я все еще имею эту проблему. – ses

+0

Кстати, нет reaso n для вызова '' нового'' этой функции. Аналогично, вы можете избавиться от анонимной оболочки функций, и все будет хорошо. –

ответ

2

С https://developer.chrome.com/extensions/tabs#method-sendMessage:

Отправляет отдельное сообщение в сценарий содержимого на указанной вкладке, с необязательным обратным вызовом для запуска, когда ответ отправляется обратно. Событие runtime.onMessage запускается в каждом скрипте содержимого, запущенном на указанной вкладке для текущего расширения.

Это означает, что если на вкладке есть скрипт содержимого, который находится на вкладке , они также будут выполнены.

+1

Ну, вот он, Патрик избил меня. Скрипт содержимого вводится во все кадры. Обратите внимание, что вы можете указать идентификатор кадра. – Xan

+0

Да, если посмотреть в содержании скрипт debug info/panel в chrome, он показывает, что у меня есть 4 контентных скрипта + все, что есть в папке lib. См., Похоже, это полезный бит документа. – ses

+0

Действительно, мой контент-скрипт Content.js создает IFrame и добавляет его на страницу пользователя html. Но я перечисляю msg только в одном месте .. и в этом месте я получил сообщение два и более раз. Я думаю, из-за этого iFrame..так, я должен различать, как игнорировать тот, который нацеливается на Ifrmae one. – ses

0

Моя проблема (также) было манифеста, content_scripts «:

"all_frames" : true 

(теперь я поставил его в false)

В зависимости от количества кадров на страницах его держали создания экземпляров сценария контента ..