从注入的脚本中删除监听器

时间:2015-08-09 19:18:46

标签: javascript google-chrome-extension code-injection opera-extension

我有Opera侧栏扩展
当扩展被触发(sb打开)时,我需要在活动选项卡中注入一些带有消息监听器的代码 代码工作正常,问题是,如果我关闭侧边栏并再次打开它,我将注入另一个侦听器(控制台将在发送消息时记录两次)...并在另一个重新打开+ 1 ..所以上。

我尝试通过移除侦听器来解决此问题,但它无法正常工作 对于每个新的扩展开始(注入),我仍然在控制台上获得+1 我无法在 removeListener 回调中放置 addListener 。根本不工作 (我想它不会以这种形式支持它)

这是我注射的代码:

chrome.tabs.executeScript({code: 
    "chrome.runtime.onMessage.removeListener(msgL);\
    chrome.runtime.onMessage.addListener(msgL);\
    function msgL(msg) {\
      if (msg.test) console.log('aaaaaaaaaaaaaaaaaaaaaaaaa');\
    }"
  }, function(result) {
    if (!result) console.log(chrome.runtime.lastError);
});

如何在注入新的侦听器时清除以前的侦听器?

1 个答案:

答案 0 :(得分:0)

在您的代码中,msgL函数每次都会重新创建removeListener尝试删除此新实例而不是之前附加的实例。

将函数存储在window对象中(这似乎不安全),注入的代码为:

if (window.msgL) chrome.runtime.onMessage.removeListener(window.msgL);
window.msgL = function(msg) {
  if (msg.test) console.log('aaaaaaaaaaaaaaaaaaaaaaaaa');
};
chrome.runtime.onMessage.addListener(window.msgL);

或跟踪扩展程序中附加的侦听器标签ID,并仅在需要时添加:

var attachedIDs = {};
chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
    var id = tabs[0].id;
    if (!attachedIDs[id]) {
        attachedIDs[id] = true;
        chrome.tabs.executeScript({code: 
            "chrome.runtime.onMessage.addListener(function msgL(msg) {\
              if (msg.test) console.log('aaaaaaaaaaaaaaaaaaaaaaaaa');\
            });"
          }, function(result) {
            if (!result) console.log(chrome.runtime.lastError);
        });
    }
});

此代码将在持久性后台页面中运行时保存attachedIDs。否则,请使用sessionStorage API或chrome.storage API来保存/恢复它。