将事件侦听器附加到与当前域不同的域

Posted

技术标签:

【中文标题】将事件侦听器附加到与当前域不同的域【英文标题】:Attach event listeners to different domain from current domain 【发布时间】:2016-07-14 16:06:03 【问题描述】:

我正在做一些项目,其中我有一个如下所述的场景

父域:www.exampledomain.com

子域:www.someotherdomain.com

例如,我的父域是 www.exampledomain.com 在我的父域中我有一个名为 capture 的按钮单击此按钮我是使用 javascript 在新选项卡中加载具有 URL www.someotherdomain.com 的子域

除了在新选项卡中加载子域 URL 外,我还尝试将事件侦听器从父域附加到子域。

我正在尝试捕获在父域中的子域中执行的所有点击操作。

我知道 CORS,但我想使用 JavaScript 来实现。

有可能吗?任何指针都非常感谢。

【问题讨论】:

您可以将其作为 chrome 扩展或 firefox 插件来实现,并不理想但值得一提 【参考方案1】:

浏览器不允许您以任何方式直接访问包含其他域页面的浏览器窗口(出于安全原因)。因此,您根本无法直接将事件侦听器添加到任何域的页面。

您可以做的是让两个页面合作(根据理论,如果它们专门合作在一起,那么它必须是安全的)。但是,即使在合作的情况下,你也不能让域 A 的页面将事件监听器添加到域 B 的页面中。你做不到。

您可以使用window.postMessage() 向另一个窗口发送某种命令,然后另一个窗口自己执行 DOM 操作。您可以发送window.postMessage() 以从另一个窗口请求一些信息,然后另一个窗口将监听您的特定请求,获取该信息并将数据发回。这种结构显然需要两个完全合作的页面。出于安全原因,您可以(并且应该)限制您愿意接受来自哪些域的消息。有关详细信息,请参阅MDN doc for window.postMessage()

关于您的具体问题:

我正在尝试捕获在子项中执行的所有点击操作 父域中的域。

您无法从父域执行此操作。您可以从父域向子域发送一条消息,要求子域在其自身上设置请求的点击处理程序,然后在每次点击发生时发送给 window.postMessage() 您的数据。大部分工作必须在子窗口内用自己的代码完成。

【讨论】:

如果我无法控制要打开的子域怎么办。我不能从中得到任何东西吗? @Santhosh_Reddy - 不。浏览器明确禁止客户端 Javascript 访问另一个域中的页面。这就是安全模型。如果您想访问该内容,您将需要一个服务器来为您获取它。 @Santhosh_Reddy - 或者您可以使用用户专门安装的浏览器插件。

以上是关于将事件侦听器附加到与当前域不同的域的主要内容,如果未能解决你的问题,请参考以下文章

如何将侦听器附加到单选按钮

将事件处理程序附加到在IFrame中呈现的HTML

将事件侦听器添加到在新窗口中打开的文档中

javascript 附加/分离事件侦听器

如何为附加到元素的每个事件侦听器打印或迭代? [复制]

React 服务器端渲染事件侦听器未附加