Прослушиватель событий расширения Chrome срабатывает несколько раз

Введение

У меня проблема с моим расширением для Chrome. Он должен отображать небольшое всплывающее окно (, созданное в jQuery ), с результатами поиска из Google на основе выбранного вами текста. По сути, вы должны иметь возможность выделить текст на любой странице, щелкните его правой кнопкой мыши (, контекстное меню ), щелкните «Поиск по выбранному ключевому слову» и появится небольшое окно на той же вкладке, что и оверлей с все результаты поиска из Google.

Проблема

Он работает, как описано, ОДНАКО только в первый раз. Когда я выделю другое ключевое слово и найду его, расширение все еще ЗАПОМНИВАЕТ предыдущие ключевые слова и выдает 2 окна одновременно. И если бы я искал другое ключевое слово, которое дало бы мне 3 окна с 2 предыдущими поисками и новым...

Я пытался удалить прослушиватель в фоновом сценарии после его выполнения, но не сработал. Похоже, что старые слушатели есть и они отвечают на запрос из скрипта контента. Можно ли их как-то удалить?

Я пытался поставить:

chrome.extension.onConnect.removeListener(listener);

в конце функции getClickHandler (), но не работает.

Я также подумал, что, возможно, этот фрагмент кода в фоновом сценарии делает это, но не уверен

return function(info, tab) {

Пожалуйста, у вас есть предложения?

Спасибо заранее!

PS. Это всплывающее окно -не может быть закрыто в данный момент, и я знаю об этом. Но вы всегда можете обновить страницу, чтобы получить чистое окно. Проблема в том, что во второй раз у меня одновременно откроется 2 всплывающих окна... и так далее, как описано выше.

Файл манифеста:

{
  "name": "Easy search Accelerator",
  "version": "1.0",
  "manifest_version": 2,
  "description": "Easily search for anything...",
  "icons": {
    "16": "icon.png",
    "48": "icon.png",
    "128": "icon.png"
  },
  "background": {
    "scripts": ["sample.js"]
  },
  "permissions": [
    "contextMenus",
    "tabs",
    "http://*/*",
    "https://*/*"
  ],
  "manifest_version": 2
}

Фоновая страница/скрипт (sample.js):

chrome.contextMenus.create({
    "title": 'Search for "%s"',
    "contexts":['selection'],
    "onclick": getClickHandler()
});
function getClickHandler() {
    return function(info, tab) {

    var url = "https://www.google.co.uk/search?q=" + info.selectionText;

    chrome.extension.onConnect.addListener(function listener(port) {
    console.assert(port.name == "searchQuery");
    port.onMessage.addListener(function(msg) {
        if (msg.keywordRequest == "Yes")
        port.postMessage({keyword: url});
    });
});

    chrome.tabs.executeScript(null, { file: "jquery-1.7.2.min.js" }, function() {
    chrome.tabs.executeScript(null, { file: "frame.js" });

    });
  };
};

Скрипт контента (frame.js)

var port = chrome.extension.connect({name: "searchQuery"});
port.postMessage({keywordRequest: "Yes"});
port.onMessage.addListener(function listen(msg) {

  var test = msg.keyword;
  $("body").append("<div style=\"position: fixed;top: 20px;right: 20px;z-index: 9999;\"><iframe style=\"border:1px solid #868686;-webkit-box-shadow: 2px 2px 20px 1px rgba(0, 0, 0, 0.5);\" src=\""+ test +"\" width=328 HEIGHT=240></iframe></div>");
});
5
задан Benjamin 23 December 2013 в 15:01
поделиться