从注入的脚本中删除侦听器
remove listener from injected script
我有 Opera 侧边栏扩展
当扩展被触发(sb 打开)时,我需要在活动选项卡
中注入一些带有消息监听器的代码
代码工作正常,问题是如果我关闭侧边栏并再次打开它,我将注入另一个侦听器(发送消息时控制台将记录两次)......然后在另一个重新打开+1 ..等等。
我试图通过删除侦听器来解决此问题,但它不起作用。
对于每个新的扩展启动(注入),我仍然在控制台上获得 +1。
而且我无法将 addListener 放入 removeListener 回调中。根本不起作用
(估计不支持这种形式)
这是我注入的代码:
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
会尝试删除这个新实例而不是之前附加的实例。
将函数存储在 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到save/restore就可以了。
我有 Opera 侧边栏扩展
当扩展被触发(sb 打开)时,我需要在活动选项卡
中注入一些带有消息监听器的代码
代码工作正常,问题是如果我关闭侧边栏并再次打开它,我将注入另一个侦听器(发送消息时控制台将记录两次)......然后在另一个重新打开+1 ..等等。
我试图通过删除侦听器来解决此问题,但它不起作用。
对于每个新的扩展启动(注入),我仍然在控制台上获得 +1。
而且我无法将 addListener 放入 removeListener 回调中。根本不起作用
(估计不支持这种形式)
这是我注入的代码:
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
会尝试删除这个新实例而不是之前附加的实例。
将函数存储在 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到save/restore就可以了。