Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从注入的脚本中删除侦听器_Javascript_Google Chrome Extension_Code Injection_Opera Extension - Fatal编程技术网

Javascript 从注入的脚本中删除侦听器

Javascript 从注入的脚本中删除侦听器,javascript,google-chrome-extension,code-injection,opera-extension,Javascript,Google Chrome Extension,Code Injection,Opera Extension,我有Opera侧边栏扩展 当启动扩展(sb打开)时,我需要向活动选项卡中的消息侦听器注入一些代码 代码工作正常,问题是如果我关闭侧边栏并再次打开它,我将插入另一个侦听器(消息发送时控制台将记录两次)…并在另一次重新打开+1..,依此类推 我试图通过删除侦听器来解决此问题,但无效。 每次新的扩展启动(注入),我仍然会在控制台上获得+1。 我无法将addListener放入removListener回调中。根本不起作用 (我想它不支持这种形式) 以下是我输入的代码: chrome.tabs.exec

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

我试图通过删除侦听器来解决此问题,但无效。
每次新的扩展启动(注入),我仍然会在控制台上获得+1。
我无法将addListener放入removListener回调中。根本不起作用
(我想它不支持这种形式)

以下是我输入的代码:

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);
});

注入新实例时,如何清除以前的侦听器?

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

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

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保存/还原它。

如果我使用window.msgL=function(msg)。。。我正在获取未捕获的语法错误:意外标识符。如果我只写函数msgL(msg)就没有错误。。。。。。所以问题是写入窗口对象。有没有可能解决这个问题?…因为我想避免存储使用(使用事件页)在我添加时开始工作;在window.msgLGood catch中的匿名函数之后,这现在是一个赋值,而不是作用域。通常情况下,这并不重要,但显然情况并非如此。我将把它添加到答案中。