跨域iframe问题

Kun*_*ist 42 html javascript jquery html5 mootools

比方说我有一个名为example.com的网站,iframe嵌入了iframe.net域,现在我想读取iframe的内容并传递一些参数来显示文本消息.喜欢你用户名.

现在问题是这个无法在两者之间建立连接,甚至无法获得我使用的iframe的innerHTML

document.getElementById('myframe').contentWindow.document.body.innerHTML;
Run Code Online (Sandbox Code Playgroud)

它抛出错误"权限被拒绝访问属性"

有谁知道如何在跨域平台上读写

Rob*_*b W 52

如果您无法控制框架网站,则无法绕过跨域策略.

如果您可以控制两个站点,则可以使用该postMessage方法跨不同域传输数据.一个非常基本的例子:

// framed.htm:
window.onmessage = function(event) {
    event.source.postMessage(document.body.innerHTML, event.origin);
};

// Main page:
window.onmessage = function(event) {
    alert(event.data);
};

// Trigger:
// <iframe id="myframe" src="framed.htm"></iframe>
document.getElementById('myframe').contentWindow.postMessage('','*');
Run Code Online (Sandbox Code Playgroud)

  • 是否有任何反向跨域代理黑客来实现它 (2认同)
  • /sf/answers/2909684641/ &lt;--类似的答案,但有更多细节 (2认同)

Prz*_*icz 5

Internet Explorer 8 中,作为参数传递的事件可能为null,这就是您需要以不同方式访问事件的原因:

frame.html 中

window.onmessage = function(event) {
   var evt = event || window.event;
   evt.source.postMessage('Message from iFrame', evt.origin);
};
Run Code Online (Sandbox Code Playgroud)

main.html 上

window.onmessage = function(event) {
   var evt = event || window.event;
   alert(evt.data);
};
Run Code Online (Sandbox Code Playgroud)

该事件的触发方式与 Rob W 介绍的相同:

document.getElementById('frameId').contentWindow.postMessage('message','*');
Run Code Online (Sandbox Code Playgroud)