跨域散列更改通信

时间:2010-11-08 09:02:24

标签: javascript html iframe cross-domain hashchange

请考虑以下两个域:domain1.com和domain2。

从domain1我打开一个指向domain2的iframe。

现在,我希望这些人能够相互沟通,我通过在两个域上应用哈希变更事件监听器来成功完成。

这样,如果domain2使用新哈希调用parent.location,则会触发父窗口(domain1)中的哈希。此外,如果来自父级的I将其src属性更改为新的哈希,则哈希更改事件将在iframe中触发。

这很棒!

麻烦来了:

浏览器中的后退和前进功能搞砸了。简单地说,通过创建两个哈希实例,必须单击浏览器后退按钮两次才能更改父哈希,因为它必须首先循环遍历iframe的哈希。

如何在不搞砸历史记录对象的情况下与跨域iframe 2路进行通信?

谢谢!

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。

Using JSON lib for example

// 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请求的两种技术。 这样:

  1. 将数据发送到iframe x(使用cookie或window.name技术)
  2. 使用iframe x中的poller抓取数据
  3. 在iframe x中执行ajax请求。
  4. 将数据发送回iframe y(使用cookie或window.name技术)
  5. 使用iframe y中的poller抓取数据
  6. 做那个笨蛋。
  7. 任何页面刷新(httprequest)或网址更改都会更新历史记录(旧版本或所有IE版本除外),因此需要更多代码。

相关问题