浏览器跨域系列(4)- 跨域和location.hash

除了前面说的jsonp,postMessage,domain的方式跨域,还有两种共享数据的方式…

window.name跨域

1
2
3
4
5
6
7
景1:现在浏览器的一个标签页里打开http://www.damonare.cn/a.html页面,你通过location.href=http://baidu.com/b.html,在同一个浏览器标签页里打开了不同域名下的页面。这时候这两个页面你可以使用window.name来传递参数。因为window.name指的是浏览器窗口的名字,只要浏览器窗口相同,那么无论在哪个网页里访问值都是一样的。

场景2:你的http://www.damonare.cn/a.html页面里使用<iframe>调用另一个http://baidu.com/b.html页面。这时候你想在a页面里获取b页面里的dom,然后进行操作。然后你会发现你不能获得b的dom。同样会因为不同源而报错,和上面提到的不同之处就是两个页面的一级域名也不相同。这时候document.domain就解决不了了。

解决方案:浏览器窗口有window.name属性。这个属性的最大特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它。。比如你在b页面里设定window.name="hello",你再返回到a页面,在a页面里访问window.name,可以得到hello。

这种方法的优点是,window.name容量很大,可以放置非常长的字符串;缺点是必须监听子窗口window.name属性的变化,影响网页性能。

location.hash跨域

1
2
3
4
5
ocation.hash就是指URL的#号后面的部分。
场景:
父窗口和iframe的子窗口之间通讯或者是window.open打开的子窗口之间的通讯。
解决方案:
父窗口改变子窗口的url的#号后面的部分,后者把要传递的参数写在#后面,子窗口监听window.onhashchange事件,得到通知,读取window.location.hash解析出有用的数据。同样子窗口也可以向父窗口传递数据。
初到贵宝地,有钱的给个钱场,没钱的挤一挤给个钱场