3

我建立一个Chrome扩展,增加了一个内容脚本的网站(我们称之为主机)。内容脚本在主机中创建一个通向我的域(跨域)的iframe。铬含量脚本:window.postMessage()“信息”事件不包含“源”属性

我能够通过parent.postMessage来自iframe的消息发送到主机()。然而,收到的'message'事件不包含阻止我将消息传回孩子的'source'属性。

UPDATE 我正在寻找一个客户端解决方案或针对此行为的解释。

+0

这肯定听起来像一个错误。我不明白为什么'源'会被忽略,因为源iframe是通过内容脚本注入的。我做了一个快速测试,当注入的源代码iframe是一个'chrome-extension://'页面,而不是'http://'页面时,它可以正常工作。 (我还没有用'http://'页面进行测试。) – apsillers

+0

谢谢。只是为了确定,我们正在谈论'源'属性,对吧? '起源'在那里,它是有效的。 –

+0

是的,'source'和'origin'都存在,我成功地使用'source.postMessage'来回复iframe。 – apsillers

回答

0

似乎有一个问题,在扩展现有的沙盒window对象。

快速解决方法是直接通过一个src元件注入的JavaScript代码到DOM代替从延伸运行它的。这样你就可以处理常规的窗口对象。

您可以在答案看一个例子,以this question

2

你必须做到这一点困难的方式。

在做的iframe,发送URL中的唯一ID安装。

例如 http://www.trackingdomain.tld/trackingscript.php?uid=38736238

然后让您的脚本从您的域每1000毫秒使用相同的uid获取返回的消息,并从中回收JSON脚本。

你也可以使用json发送消息。

但是这种解决方案将意味着你会被迫使用服务器端脚本。

+0

谢谢迈克尔,这个消息应该创建一个实时的UI反应,所以服务器端解决方案是我的最后手段。这是已知的行为吗? –

+1

Postmessage行为最好是片状。主要的问题是每个浏览器制造商在它应该和不应该工作时都有不同的想法,并且每个软件版本的行为都不相同。如果您需要实时行为分析,只需将脚本的JavaScript文件加载到每个Web页面即可。为了安全起见,请在https安全服务器上托管它以避免安全冲突警告。或者只需将您的JavaScript注入到加载的每个文档中。这样你可以确保行为是实时的。最终状态消息/统计信息可以通过ajax发送到您的网站 – Tschallacka