我个人将跨域问题分类为两种:网络请求跨域和非网络请求跨域。
网络请求跨域
非网络请求跨域
document.domain
如果要进行通信的窗口之间主域相同,子域不同,则可以直接将它们的 document.domain
修改为主域,这样就不存在跨域问题了。
1 | <iframe name="a" src="http://a.domain.com"></iframe> |
1 | <!-- domain 初始值为 a.domain.com --> |
1 | <!-- domain 初始值为 b.domain.com --> |
location.hash
父窗口 A 修改子窗口 B 的 location.hash
值,会触发对应子窗口 B window
对象的 onhashchange
事件处理程序。这个过程是单向的,但是你可以通过在子窗口 B 中添加一个 iframe
标签,这个 iframe
的 src
域名与父窗口域名相同的,然后在这个 iframe
页面内调用父窗口 A 的函数,此时是不存在跨域的。
window.name
window
对象的 name
属性有一个独特之处,一个窗口只要一直存在并且没有被主动的更改 name
属性,那么它的 name
属性会一直保持不变。即窗口的 URL(或 iframe
的 src
)随意变化,name
属性也不会变。name
属性内存最大可以支持 2MB,所以可以通过它来传递数据。
window.postMessage
通过 window.postMessage
方法和 message 事件完成数据的传递。