Google chrome extension chrome.runtime.onMessage多次调用

Google chrome extension chrome.runtime.onMessage多次调用,google-chrome-extension,Google Chrome Extension,我创建了一个扩展。当用户单击扩展图标时,它将向内容脚本发送消息,然后内容脚本再次调用函数。在该函数中,它将向后台脚本发送消息。我面临一些奇怪的行为,后台脚本中的chrome.runtime.onMessage.addListener()多次执行 manifest.json { “清单版本”:2, “名称”:“报告人”, “版本”:“1.0”, “描述”:“Loreipsum.”, “背景”:{ “脚本”:[“bootstrap.js”], “持续”:假 }, “浏览器操作”:{ “默认图标”:“

我创建了一个扩展。当用户单击扩展图标时,它将向内容脚本发送消息,然后内容脚本再次调用函数。在该函数中,它将向后台脚本发送消息。我面临一些奇怪的行为,后台脚本中的chrome.runtime.onMessage.addListener()多次执行

manifest.json

{
“清单版本”:2,
“名称”:“报告人”,
“版本”:“1.0”,
“描述”:“Loreipsum.”,
“背景”:{
“脚本”:[“bootstrap.js”],
“持续”:假
},
“浏览器操作”:{
“默认图标”:“img/icon48.png”,
“默认标题”:“Gitlab问题”
},
“网络可访问资源”:[
“模板/*.html”
],
“内容脚本”:[{
“所有帧”:false,
“css”:[“content_style.css”],
“js”:[“content_script.js”],
“匹配项”:[“http://*/*”,“*/*”]
}],
“图标”:{
“16”:“img/icon20.png”,
“48”:“img/icon48.png”,
“128”:“img/icon128.png”
},
“权限”:[
“标签”,
“活动标签”,
"


编辑:添加清单文件

我认为下面的代码将解决您的问题

chrome.runtime.onInstalled只运行一次,因此您的侦听器不会绑定多次

chrome.runtime.onInstalled.addListener(函数(详细信息)){
chrome.browserAction.onClicked.addListener(clickOnIssue);
chrome.runtime.onMessage.addListener(函数(请求、发送方、发送响应){
//TODO:你的代码
});
});

我认为下面的代码可以解决您的问题

chrome.runtime.onInstalled只运行一次,因此您的侦听器不会绑定多次

chrome.runtime.onInstalled.addListener(函数(详细信息)){
chrome.browserAction.onClicked.addListener(clickOnIssue);
chrome.runtime.onMessage.addListener(函数(请求、发送方、发送响应){
//TODO:你的代码
});
});

这必须是因为您在manifest.json中使用了所有的\u frames:true,所以页面的每个iframe都会运行您的内容脚本。@wOxxOm我编辑问题并添加有问题的清单文件。您可以检查所有的\u frames:false是否在每次更新选项卡时都在chrome.runtime.onMessage中添加新的侦听器。将回调提取到顶级函数中@wOxxOm我检查是否(info.status==='complete')然后只添加侦听器。您建议使用哪种顶级函数?完整状态并不意味着其他属性不会在另一个事件中报告,您可以通过设置断点或通过console.log看到这一点。您的代码每次都会添加一个新的匿名函数。将其移动到顶级函数将允许chrome API跳过添加侦听器er下次。JavaScript就是这样工作的。这一定是因为您在manifest.json中使用了所有的\u frames:true,所以页面的每个iframe都会运行您的内容脚本。@wOxxOm我编辑问题并添加有问题的清单文件。您可以检查所有的\u frames:false是否在每次更新选项卡时都在chrome.runtime.onMessage中添加新的侦听器。提取e回调到顶级函数中。@wOxxOm我检查是否(info.status==='complete')然后只添加侦听器。您建议使用哪种顶级函数?完整状态并不意味着其他属性不会在另一个事件中报告,您可以通过设置断点或通过console.log看到这一点。您的代码每次都会添加一个新的匿名函数。将其移动到顶级函数将允许chrome API跳过添加侦听器呃下次。这就是JavaScript的工作原理。