重新打开弹出窗口后,为什么弹出脚本向内容脚本发送更多消息?

时间:2019-01-01 18:53:29

标签: firefox-addon firefox-webextensions

我有firefox webextension。在popup.html中,我有一个按钮,单击该按钮,popup.js将消息发送到content.js。 Content.js接收消息,并使用文本“来自弹出窗口的消息”创建console.log。如果再次单击该按钮,将重复执行该操作。问题是当我单击远离弹出窗口并再次打开弹出窗口并再次单击按钮时,因为content.js从popup.js接收了两条消息,并创建了两个console.log。如果再次重复,content.js会收到三则消息,依此类推。 我将弹出窗口重新打开多少次,与邮件发送的次数一样。

我认为问题出在popup.js中,但是我不知道。

manifest.json:

{
    "manifest_version": 2,
    "name": "Extension",
    "version": "1.0",

    "description": "Firefox extension",

    "permissions": [
        "activeTab",
        "<all_urls>",
        "tabs"
    ],

    "browser_action": {
       "default_title": "Script",
       "default_popup": "popup.html"
    }
}

popup.html:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <button class="action">Start</button>
    <script src="popup.js"></script>
  </body>
</html>

popup.js:

browser.tabs.executeScript({file: "content.js"})
.then(listenForClicks)

function listenForClicks() { 
  document.addEventListener("click", (e) => {
    if (e.target.classList.contains("action")) {
      browser.tabs.query({active: true, currentWindow: true})
        .then(send)
    }
    function send(tabs) { 
      browser.tabs.sendMessage(tabs[0].id, {
          command: "message"
          });
      }
  });
}

content.js:

function handleMessage(request, sender, sendResponse) {
    if(request.command === "message"){
      console.log("Message from popup");
    }
}

browser.runtime.onMessage.addListener(handleMessage);

预期结果是单击按钮会导致创建一个console.log。甚至以为弹出窗口被重新打开了多次。

1 个答案:

答案 0 :(得分:0)

关闭弹出窗口后,不会立即删除侦听器。垃圾收集器需要一些时间才能将其删除。

如果您使用的是Firefox 50+,则可以在EventTarget.addEventListener()中为监听器设置def find_all(a_str, sub): start = 0 while True: start = a_str.find(sub, start) if start == -1: return yield start + 1 start += len(sub) ,以便在第一次之后将监听器删除。

对于较旧的浏览器,您可以使用N_list = list(find_all(DNA_sequence, 'N')) dash_list = list(find_all(DNA_sequence, '-')) positions_list = N_list + dash_list all_positions_set = all_positions_set.union(positions_list) count += 1 print(str(count) + '\t' +record.id+'\t'+'processed') output_file.write(record.id+'\t'+str(sorted(positions_list))+'\n') 手动删除侦听器。

现在,如果您希望内容仅接收一个消息,那么您可以在第一次之后删除监听器,例如:

评论后更新

popup.js:

once

content.js:

document.removeEventListener()