在 http://www.cnblogs.com/zhuzhenwei918/p/6759459.html 这篇文章中,我提到了几种跨域的方式,这里主要讲解使用window.name实现跨域。

   跨域就是说必须同协议、域名、端口号,我们才能获取其内容,对其进行访问。

  window.name这个属性不是一个简单的全局属性 --- 只要在一个window下,无论url怎么变化,只要设置好了window.name,那么后续就一直都不会改变,同理,在iframe中,即使url在变化,iframe中的window.name也是一个固定的值,利用这个,我们就可以实现跨域了。

  下面是localhost:8088/test2.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test2</title>
</head>
<body>
<h2>test2页面</h2>
<script>
var person = {
name: 'wayne zhu',
age: ,
school: 'xjtu'
}
window.name = JSON.stringify(person)
</script>
</body>
</html>

  即我们希望吧test2.html中的数据传递出去,到localhost:8081/test1.html中去。

  下面是localhost:8081/test1.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test1</title>
</head>
<body>
<h2>test1页面</h2>
<iframe src="http://localhost:8088/test2.html" frameborder=""></iframe>
<script>
var ifr = document.querySelector('iframe')
ifr.style.display = 'none'
var flag = ;
ifr.onload = function () {
if (flag == ) {
console.log('跨域获取数据', ifr.contentWindow.name);
ifr.contentWindow.close();
} else if (flag == ) {
flag = ;
ifr.contentWindow.location = 'http://localhost:8081/proxy.html';
}
}
</script>
</body>
</html>

这里的意图很明确,就是使用iframe将test2.html加载过来,因为只是为了实现跨域,所以将之隐藏,但是,这时已经完成了最重要的一步,就是将iframe中window.name已经成功设置,但是现在还获取不了,因为是跨域的,所以,我们可以把src设置为当前域的proxy.html。

  另外,这里之所以要设置flag,是因为每当改变location的时候,就会重新来一次onload,所以我们希望获取到数据之后,就直接close(),故采用此种方法。

这个proxy.html内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>proxy</title>
</head>
<body>
<p>这是proxy页面</p>
</body>
</html>

  是的,什么都没有,当然,我们也可以把src就替换成test1.html,但是这样的坏处很明显,就是需要把test1.html中的数据加载一遍,这不是我们所希望的。

  

  

  OK! 这样,就成功完成了跨域!

  代码: https://github.com/zzw918/cross-origin

  

  

  

  

  

  如我们希望localhost:8081/test1.html可以访问到localhost:8088/test2.html中的数据,正常来说,由于跨域,这一定是不可能的,一般的实现思路可以是这样的。

最新文章

  1. js(jQuery)获取时间的方法及常用时间类
  2. jsp与Servlet
  3. LESSCSS的几点摘要
  4. iOS 瀑布流的Demo
  5. 强大的内网劫持框架之MITMf
  6. Sqli-labs less 27a
  7. Javascript addEventListener dispatchEvent
  8. return的用法
  9. DataX的简单编译安装测试
  10. 【HDOJ】4370 0 or 1
  11. Occupy Cities
  12. PreferenceFragment界面透明问题
  13. 菜单工具栏wxPython菜单与工具栏基础示例
  14. Java大世界
  15. 痞子衡嵌入式:并行接口NAND标准(ONFI)及SLC Raw NAND简介
  16. Why the Anaconda command prompt is the first choice in windows?
  17. bootstrap-table前端修改后台传来的数据重新进行渲染
  18. 黄聪:通过 itms:services://? 在线安装ipa ,跨过appstore
  19. 从零开始学 Web 之 Ajax(三)Ajax 概述,快速上手
  20. Qt介绍1---QPA(Qt Platform Abstraction)

热门文章

  1. CYUSB3014芯片使用EEPROM无法下载固件说明
  2. handsontable-developer guide-load and save
  3. MS EXCEL2013添加Oracle Web ADI菜单
  4. 自定义TFS工作项&ldquo;所有链接&rdquo;列表中的列
  5. nutch-2.2.1 hadoop-1.2.1 hbase-0.92.1 集群部署(实用)
  6. Sql里时间加减
  7. bootstrap table 的searchParam参数传递
  8. trace sql log
  9. 「HEOI2014」南园满地堆轻絮
  10. Net Manager测试连接测试没有成功,用户权限问题,以管理员身份运行后测试成功