Google chrome Chrome extension onConnect listener从不同选项卡多次触发

Google chrome Chrome extension onConnect listener从不同选项卡多次触发,google-chrome,google-chrome-extension,Google Chrome,Google Chrome Extension,我正在创建一个扩展名,该扩展名使用.js文件的这种结构: A页(内容脚本)->B页(背景脚本)->C页(内容脚本) 在A页上,有一些链接,单击后会向B发送消息。B的想法是打开一个新选项卡并加载C页;当C完全加载时,它将向B发送一条消息,B将向C发送一些数据以填写表单 这一切都是可行的,但在输入一些日志后,我意识到如果从A页单击多个链接,B中的侦听器实际上会触发两次。下面是代码的样子: A页: $(document).ready(function () { $('.click-test').c

我正在创建一个扩展名,该扩展名使用.js文件的这种结构:

A页(内容脚本)->B页(背景脚本)->C页(内容脚本)

在A页上,有一些链接,单击后会向B发送消息。B的想法是打开一个新选项卡并加载C页;当C完全加载时,它将向B发送一条消息,B将向C发送一些数据以填写表单

这一切都是可行的,但在输入一些日志后,我意识到如果从A页单击多个链接,B中的侦听器实际上会触发两次。下面是代码的样子:

A页:

$(document).ready(function () {
  $('.click-test').click(function() {
    chrome.runtime.sendMessage({formData: here}, function(response) {
    });
  });
});
B:

C页:

$(document).ready(function() {
  chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
      // Fill in form with request data    
  });
  var port = chrome.runtime.connect({name: "formStatus"});
  port.postMessage({status: "formReady"});
});
当点击页面A上的第一个链接时,一切正常。单击第二个链接时,B中的onConnect侦听器将触发两次:首先使用与第一次单击相同的数据,然后使用与第二次单击对应的正确数据


有没有办法在B的侦听器启动一次后立即禁用它?或者,我只是把这个代码弄得太复杂了吗?

Rob W.在注释中是正确的-删除侦听器就像他在addListener部分中所做的那样。谢谢

您的消息传递逻辑有缺陷。我没有时间尝试修复您的完整逻辑,但是获取多个onConnect调用的原因是您正在为每个onMessage调用注册一个新的事件侦听器。要解决此问题,请在收到连接后,使用
chrome.runtime.onConnect.addListener(函数侦听器(端口){chrome.runtime.onConnect.removeListener(侦听器);
,注销onConnect消息侦听器。
$(document).ready(function() {
  chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
      // Fill in form with request data    
  });
  var port = chrome.runtime.connect({name: "formStatus"});
  port.postMessage({status: "formReady"});
});