请考虑以下两个域:domain1.com和domain2。
从domain1我打开一个指向domain2的iframe。
现在,我希望这些人能够相互沟通,我通过在两个域上应用哈希变更事件监听器来成功完成。
这样,如果domain2使用新哈希调用parent.location,则会触发父窗口(domain1)中的哈希。此外,如果来自父级的I将其src属性更改为新的哈希,则哈希更改事件将在iframe中触发。
这很棒!
麻烦来了:
浏览器中的后退和前进功能搞砸了。简单地说,通过创建两个哈希实例,必须单击浏览器后退按钮两次才能更改父哈希,因为它必须首先循环遍历iframe的哈希。
如何在不搞砸历史记录对象的情况下与跨域iframe 2路进行通信?
谢谢!
答案 0 :(得分:7)
使用easyXDM,这是一个为您完成所有艰苦工作的JavaScript库,使您能够在所有浏览器(包括IE6)中进行跨域通信和RPC。
这不会将HashTransport用于任何当前浏览器(甚至不是IE6),因此不会更改历史记录。
你找不到更好的东西..
您可以在此Script Junkie article中了解其中的一些内部工作原理,或直接转到readme at github
答案 1 :(得分:2)
跨域通信的另一种技术是(ab)使用window.name
。它需要iframe最初最初具有同域src,之后您将移动到设置window.name的另一个域,然后返回原始源(历史记录中的后退)。我们的想法是window.name
除非明确设置,否则不会发生变化,这意味着您可以跨域转移window.name
数据。
该技术在以下方面有更详细的描述:
- http://skysanders.net/subtext/archive/2010/10/11/leveraging-window.name-transport-for-secure-and-efficient-cross-domain-communications.aspx
- http://jectbd.com/?p=611
请务必选择避免在IE中点击声音的实现。
不幸的是,它仍然与你的历史息息相关,但它向前迈出了一步,然后又回到了它所处的历史点。但是,一个很大的好处是,您不必解析和编码URI字符串,但可以立即使用JSON。
// access window.name from parent frame
// note: only when iframe stepped back to same domain.
var data = JSON.parse( iframe.contentWindow.name );
// set child frame name
// note: only when iframe stepped back to same domain.
iframe.contentWindow.name = JSON.stringify( {
foo : "bar"
} ); // to JSON string
// set own name ( child frame )
window.name = JSON.stringify( {
foo : "bar"
} ); // to JSON string
Cookie技术也是可行的,如果您想要避免历史记录更改但仍需要http请求,则需要在目标iframe中执行ajax请求的两种技术。 这样:
任何页面刷新(httprequest)或网址更改都会更新历史记录(旧版本或所有IE版本除外),因此需要更多代码。