【跨域】location.hash

原理是利用location.hash来进行传值。在url: http://a.com#helloword中的‘#helloworld’就是location.hash,改变hash并不会导致页面刷新,所以可以利用hash值来进行数据传递,当然数据容量是有限的。假设域名a.com下的文件cs1.html要和cnblogs.com域名下的cs2.html传递信息,cs1.html首先创建自动创建一个隐藏的iframe,iframe的src指向cnblogs.com域名下的cs2.html页面,这时的hash值可以做参数传递用。cs2.html响应请求后再将通过修改cs1.html的hash值来传递数据(由于两个页面不在同一个域下IE、Chrome不允许修改parent.location.hash的值,所以要借助于a.com域名下的一个代理iframe;Firefox可以修改)。同时在cs1.html上加一个定时器,隔一段时间来判断location.hash的值有没有变化,一点有变化则获取获取hash值。代码如下:

先是a.com下的文件cs1.html文件:

<html>
<body>
<script>
var ifr = document.createElement('iframe'); 
ifr.style.display = 'none'; 
ifr.src = 'http://www.cnblogs.com/lab/cscript/cs2.html#paramdo'; 
document.body.appendChild(ifr); 
function checkHash() { 
try { 
var data = location.hash ? location.hash.substring(1) : ''; 
if (console.log) { 
console.log('Now the data is '+data); 
} 
} catch(e) {}; 
} 
setInterval(checkHash, 2000); 
</script>
</body>
</html>

cnblogs.com域名下的cs2.html:

<html>
<body>
<script>
//模拟一个简单的参数处理操作 
switch(location.hash){ 
case '#paramdo': 
callBack(); 
break; 
case '#paramset': 
//do something…… 
break; 
} 

function callBack(){ 
try { 
parent.location.hash = 'somedata'; 
} catch (e) { 
// ie、chrome的安全机制无法修改parent.location.hash, 
// 所以要利用一个中间的cnblogs域下的代理iframe 
var ifrproxy = document.createElement('iframe'); 
ifrproxy.style.display = 'none'; 
ifrproxy.src = 'http://a.com/test/cscript/cs3.html#somedata'; // 注意该文件在"a.com"域下 
document.body.appendChild(ifrproxy); 
} 
} 
</script>
</body>
</html>

a.com下的域名cs3.html

<html>
<body>
<script>
//因为parent.parent和自身属于同一个域,所以可以改变其location.hash的值 
parent.parent.location.hash = self.location.hash.substring(1); 
</script>
</body>
</html>

当然这样做也存在很多缺点,诸如数据直接暴露在了url中,数据容量和类型都有限等……