我正在使用
window.postMessage({message: "Hello !"}, url);
从Chrome扩展程序(我不知道这是否相关)向具有多个已打开页面的窗口中的特定页面发送消息。我注意到有时我的两个页面的相同的网址。
我有一个简单的问题:
我如何确定postMessage发送邮件的页面是什么?
我想将邮件发送到一个标签。我可以使用除网址之外的任何其他内容来识别它吗?
提前致谢!
答案 0 :(得分:0)
考虑到你说你可以修改远程网站的代码,我不知道如何解决postMessage
解决方案,这里有几个选择。 我很想知道是否有办法修复postMessage
方法,因为它是文档中推荐的方法!
首先,您需要从中央背景页面协调脚本,该页面可以跟踪打开的标签页。
这是来自Chrome文档的旧建议,已被window.postMessage
示例替换。它被描述为here(忽略旧的chrome.extension.connect
API),包括在共享DOM中触发自定义事件。
因此,示例体系结构将是一个后台页面,决定向哪个选项卡发送消息,并通过chrome.tabs.sendMessage
向该标签发送消息,您的内容脚本将使用chrome.runtime.onMessage
进行监听。然后,选项卡的内容脚本可以使用上述自定义事件技术与页面进行通信。
保持标签大小的一种可能方法:拥有tabs
权限,以便能够使用chrome.tabs
API枚举所有打开的标签页。然后,您的背景页面可以根据URL决定要发送哪个标签。
另一种可能的方法是,为了消除对可怕的tabs
权限的需求,让您的内容脚本在初始化后立即使用chrome.runtime.connect
向后台页面报告。然后,后台页面可以跟踪脚本的所有活动实例,从而决定要发送哪个选项卡。
这是一种与一个确切扩展进行交流的“现代”方式。
Chrome文档here中对此进行了描述。您可以将扩展程序定义为可从网页外部连接,并且您的网页会启动与后台脚本的端口连接。
然后,如上所述,您可以跟踪实时端口并将其用于通信,从而切断内容脚本中间人。