我们正在编写一个带有内容脚本的chrome扩展程序(内部工具)。内容脚本创建一个iframe,并将源设置为popup.html。然后,内容脚本从文档中获取数据并发送如下消息:
chrome.runtime.sendMessage({ messageObjectHere });
popup.js的监听方式如下:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
// Process message here
});
一切正常,直到我们打开第二个选项卡或第三个选项卡等为止,因为内容脚本具有setTimeout,该setTimeout一直在监视页面中的更改并将更新发送到popup.js。
非常快速地查看console.logs,消息的数量增加了,我相信popup.js正在处理所有打开的选项卡中的所有消息。
有没有一种方法可以确保内容脚本仅将消息发送到它创建的popup.js,并在每个页面保留一个实例。我是否缺少contentScript.js和popup.js的体系结构和实例中的基本知识?
当我们从popup.js调用sendMessage时,用户:
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
chrome.tabs.sendMessage(tabs[0].id, { messageObjectHere });
});
但这似乎不是contentScript.js的选项。在我走下一条非常黑暗的道路之前,即跟踪原始消息和目标消息的唯一ID,并确保只处理右侧选项卡的消息,还有更好的方法吗?