Google chrome extension Chrome扩展:向特定iframe中加载的页面发送消息

Google chrome extension Chrome扩展:向特定iframe中加载的页面发送消息,google-chrome-extension,messaging,Google Chrome Extension,Messaging,我正在开发一个Chrome扩展来支持一个包含多个iFrame的页面,每个iFrame从其他域加载一个页面。我需要向加载了这些iFrame中特定一个的页面发送消息。顶级页面和iframe中的页面都有自己的内容脚本,因此可以使用完整的消息传递API 从顶部页面,当我执行chrome.runtime.sendMessage()时,所有iFrame都会得到它(顶部窗口也是如此,但它的内容脚本很容易知道特定的消息不是为它准备的)。是否有任何方法可以针对这些iframe中的一个特定的iframe,或者让所需

我正在开发一个Chrome扩展来支持一个包含多个iFrame的页面,每个iFrame从其他域加载一个页面。我需要向加载了这些iFrame中特定一个的页面发送消息。顶级页面和iframe中的页面都有自己的内容脚本,因此可以使用完整的消息传递API

从顶部页面,当我执行chrome.runtime.sendMessage()时,所有iFrame都会得到它(顶部窗口也是如此,但它的内容脚本很容易知道特定的消息不是为它准备的)。是否有任何方法可以针对这些iframe中的一个特定的iframe,或者让所需的iframe页面知道msg是针对它的

请注意

  • 顶部页面无法直接访问iframe页面中的任何内容,因为它们来自其他域

  • 顶部页面知道最初在每个帧中加载的URL,但用户可能已经从那里导航,因此将目标URL作为msg参数包含在接收脚本中以进行检查是行不通的

这里有什么明显的我遗漏的吗


更新:@wOxxOm的回答很有帮助,但我仍在思考如何获得所需的frameid

更具体地说,我需要对这些iframe做两件事,它们都需要frameId:

  • 将脚本注入每个iframe
  • 将MSG发送到特定iframe以响应顶级页面上的用户操作
由于iFrame是在用户工作时动态创建和删除的,所有这些都变得复杂

我的一个想法是,首先用URL“about:blank?id=nnn”加载每个新的iFrame,其中nnn是对应iFrame元素的DOM id。这样,当我调用getAllFrames()时,我可以通过该URL识别新的iframes,并为每个DOM id构建FrameID的查找。完成后,我可以加载真实的URL,并在加载后插入脚本


这似乎太迂回了,我希望我错过了一些支持API或其他简单的方法。

我确实找到了一个解决方案,但它非常间接。我希望这是清楚的;据我所知,所有这些活动部件都是野兽的本性

下面是我最后做的:

  • 向每个iframe添加了一个name属性,与它的DOM id相同
  • 当每个iframe中的页面加载时,一个全局内容脚本调用chrome.runtime.sendMessage(),传递该名称,它可以作为window.name访问该名称
  • 后台脚本获取该消息,该iframe的frameId为sender.frameId,并调用chrome.tabs.sendMessage(),传递frameId和窗口名
  • 顶级页面的内容脚本根据这些窗口名(也称为iframe DOM id)/frameId对构建查找对象
  • 当顶级页面的内容脚本希望向任何iframe页面发送消息时,它会在该查找对象中查找目标的frameId,然后调用chrome.runtime.sendMessage(),其中的消息类型指示它是针对特定iframe的,并包括该frameId
  • 作为响应,后台脚本使用chrome.tabs.sendMessage()将其发送到请求的iframe的内容脚本,并按照wOxxOm的建议,将{frameId:request.frameId}作为第三个参数传递

  • 这在这里起作用,但请务必让我知道是否有更简单的方法来实现这一点。

    请参阅chrome的文档。**tabs**。sendMessage:第三个参数可能是具有frameId的对象。要枚举所有帧,可以使用chrome.webNavigation.getAllFrames谢谢@wOxxOm,好消息。不知何故,我错过了API的整个webNavigation部分,看起来它可以完成这项工作,而且对我的项目的其他部分也很有帮助。如果你把你的评论作为回答,我会把它标记为答案。说得太快了。getAllFrames()方法看起来确实非常有用,但结果不是DOM顺序,也不是我所知道的任何顺序。如果是这样的话,顶层页面如何知道其中的哪个项对应于它要针对的DOM中的特定iframe?