Javascript 在跨域上从iframe与窗口通信

Javascript 在跨域上从iframe与窗口通信,javascript,html,iframe,same-origin-policy,Javascript,Html,Iframe,Same Origin Policy,假设我有一个域名为a.example.com的网页,其中有一个iframe,域名为b.example.com,但不符合同源策略 现在,我使用相同域的iframe中的window.open打开一个新窗口,即 b、 example.com 我的任务是将消息发送回iframe 对于打开的窗口,window.opener为空 我读到我可以使用postMessage进行通信,但是我应该将数据发布到哪个元素。如何获取父窗口的引用,即iframe。谁说iframe是您的?在这方面,浏览器不能信任您,因为有人可

假设我有一个域名为a.example.com的网页,其中有一个iframe,域名为b.example.com,但不符合同源策略

现在,我使用相同域的iframe中的window.open打开一个新窗口,即 b、 example.com

我的任务是将消息发送回iframe

对于打开的窗口,window.opener为空


我读到我可以使用postMessage进行通信,但是我应该将数据发布到哪个元素。如何获取父窗口的引用,即iframe。

谁说iframe是您的?在这方面,浏览器不能信任您,因为有人可能会弄乱您的页面并加载其他内容,因此现代浏览器会完全锁定iframe通信。即使使用访问控制,也无法实现双向通信


但是,如果您可以使iframe和所属文档使用相同的语言,那么您就可以使用通信:postMessage基本上只发布字符串,因此任何JS对象都需要JSON.stringize为每个人都可见的字符串。任何文档上下文都可以发布消息,每个上下文都可以决定是否侦听新消息。如果是,那么您可以让iframe发送拥有窗口可以解析的消息,反之亦然。

为了让他们的站点(其中包含您控制内容的iframe)从通过单击内容中的内容打开的窗口获取信息,他们必须允许访问他们的站点。如果您只想从通过单击您控制的页面上的某个内容打开的窗口中获取数据,则如下所示:

var newWindow = open('yourURL.php');
var someElement = newWindow.document.getElementById('someId');
console.log(someElement.value); // assuming it's an input
var openerElement = opener.document.getElementById('openerWindowId');
console.log(openerElement.innerHTML); // assuming it's not an input
如果您想从使用新打开的窗口打开其他页面的页面中获取信息,如下所示:

var newWindow = open('yourURL.php');
var someElement = newWindow.document.getElementById('someId');
console.log(someElement.value); // assuming it's an input
var openerElement = opener.document.getElementById('openerWindowId');
console.log(openerElement.innerHTML); // assuming it's not an input

访问控制允许来源:headerI喜欢@PHPglue的想法。但是,是否可以在打开的窗口中绑定一个事件,以便在该窗口中单击“发送消息”时,消息应发送到iframe。仅仅因为您在您的网站中打开了其他人的网页,您就无法访问他们的网页。我真的不理解您的意图。你控制a.example.com还是b.example.com?您对window.open的哪一个进行编码?使用相同的语言意味着他们应该满足相同的原产地政策?如果是这样的话,那是不可能的。我只需要获取数据是的,它是从打开的窗口到iframe的字符串。iframe中的页面由我控制,其他服务正在嵌入它们的站点中。因此,从我的iframe打开的窗口应该能够将某个事件的数据发送回我。不,他们需要能够解析其他人转储到消息池中的字符串。从所有者那里获取数据的唯一方法是,对所有者知道是请求的请求发送后消息,然后让所有者使用自己的消息进行响应,您的iframe知道如何再次解析。然后,如何绑定click事件,以便一旦按下按钮,我只能获取iframe中的数据。最初,正如您所提到的,“someElement”将为空。除非用户输入数据并单击“发送”按钮,否则我们应该通过您的方法获取数据,即“newWindow.document.getElementById'someId';如果无法控制iframe,那么确实需要完全忽略它。做任何事,就像它根本不存在一样。newWindow.document.getElementById'buttonId'。onclick=函数{/*不要使用newWindow,您正在谈论当前窗口*/};我真的不确定你在这里没有得到什么。