javascript跨域的方法汇总


Posted in Javascript onOctober 23, 2015

此文章学习借鉴了一些其他前端同学的文章,自己做了个实践总结

以下的例子包含的文件均为为 http://www.a.com/a.html 、http://www.a.com/c.html 与 http://www.b.com/b.html,要做的都是从a.html获取b.html里的数据

1.JSONP

jsonp是利用script标签没有跨域限制的特性,通过在src的url的参数上附加回调函数名字,然后服务器接收回调函数名字并返回一个包含数据的回调函数

function doSomething(data) {
    // 对data处理
  }
  var script = document.createElement("script");
  script.src = "http://www.b.com/b.html?callback=doSomething";
  document.body.appendChild(script);

  // 1.生成一个script标签,将其append在body上,向服务器发出请求
  // 2.服务器根据 callback 这个参数生成一个包含数据的函数 doSomething({"a", "1"})
  // 3.页面事先已声明doSomething函数,此时执行 doSomething(data) 这个函数,获得数据

2.HTML5的postMessage

假设在a.html里嵌套个<iframe src="http://www.b.com/b.html" frameborder="0"></iframe>,在这两个页面里互相通信

a.html

window.onload = function() {
    window.addEventListener("message", function(e) {
      alert(e.data);
    });

    window.frames[0].postMessage("b data", "http://www.b.com/b.html");
  }

b.html

window.onload = function() {
    window.addEventListener("message", function(e) {
      alert(e.data);
    });
    window.parent.postMessage("a data", "http://www.a.com/a.html");
  }

这样打开a页面就先弹出 a data,再弹出 b data

3.window.name + iframe

window.name的原理是利用同一个窗口在不同的页面共用一个window.name,这个需要在a.com下建立一个代理文件c.html,使同源后a.html能获取c.html的window.name

a.html

var iframe = document.createElement("iframe");
  iframe.src = "http://www.b.com/b.html";
  document.body.appendChild(iframe); // 现在a.html里建一个引用b.html的iframe,获得b的数据

  var flag = true;
  iframe.onload = function() {
    if (flag) {
      iframe.src = "c.html"; 
// 判断是第一次载入的话,设置代理c.html使和a.html在同目录同源,这样才能在下面的else取到data
      flag = false;
    } else { // 第二次载入由于a和c同源,a可以直接获取c的window.name
      alert(iframe.contentWindow.name);

      iframe.contentWindow.close();
      document.body.removeChild(iframe);
      iframe.src = '';
      iframe = null;
    }
  }

b.html

window.name = "这是 b 页面的数据";

4.window.location.hash + iframe

b.html将数据以hash值的方式附加到c.html的url上,在c.html页面通过location.hash获取数据后传到a.html(这个例子是传到a.html的hash上,当然也可以传到其他地方)

a.html

var iframe = document.createElement("iframe");
  iframe.src = "http://www.b.com/b.html";
  document.body.appendChild(iframe); // 在a页面引用b
  function check() { // 设置个定时器不断监控hash的变化,hash一变说明数据传过来了
    var hashs = window.location.hash;
    if (hashs) {
      clearInterval(time);
      alert(hashs.substring(1));
    }
  }
  var time = setInterval(check, 30);

b.html

window.onload = function() {
    var data = "this is b's data"; 
    var iframe = document.createElement("iframe");
    iframe.src = "http://www.a.com/c.html#" + data;
    document.body.appendChild(iframe); // 将数据附加在c.html的hash上
  }

c.html

// 获取自身的hash再传到a.html的hash里,数据传输完毕
parent.parent.location.hash = self.location.hash.substring(1);

5.CORS

CORS是XMLHttpRequest Level 2 里规定的一种跨域方式。在支持这个方式的浏览器里,javascript的写法和不跨域的ajax写法一模一样,只要服务器需要设置Access-Control-Allow-Origin: *

6.document.domain

这种方式适用于主域相同,子域不同,比如http://www.a.com和http://b.a.com
假如这两个域名下各有a.html 和b.html,

a.html

document.domain = "a.com";
  var iframe = document.createElement("iframe");
  iframe.src = "http://b.a.com/b.html";
  document.body.appendChild(iframe);
  iframe.onload = function() {
    console.log(iframe.contentWindow....); // 在这里操作b.html里的元素数据
  }

b.html

document.domain = "a.com";

注意:document.domain需要设置成自身或更高一级的父域,且主域必须相同。

Javascript 相关文章推荐
javascript使用正则表达式检测IP地址
Dec 03 Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
Aug 05 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
Jan 31 Javascript
jQuery中$.each()函数的用法引申实例
May 12 Javascript
如何提高Dom访问速度
Jan 05 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
Feb 13 Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 Javascript
create-react-app安装出错问题解决方法
Sep 04 Javascript
使用vue-cli webpack 快速搭建项目的代码
Nov 21 Javascript
如何使用pm2快速将项目部署到远程服务器
Mar 12 Javascript
Vue.js中的extend绑定节点并显示的方法
Jun 20 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
Oct 23 #Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
Oct 23 #Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
Oct 23 #Javascript
深入浅析javascript立即执行函数
Oct 23 #Javascript
js判断手机号运营商的方法
Oct 23 #Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
Oct 23 #Javascript
js计算文本框输入的字符数
Oct 23 #Javascript
You might like
第五节--克隆
2006/11/16 PHP
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
php递归函数怎么用才有效
2018/02/24 PHP
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
详解Vue整合axios的实例代码
2017/06/21 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
Python 通过URL打开图片实例详解
2017/06/01 Python
利用Python如何批量修改数据库执行Sql文件
2018/07/29 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
马云的职业生涯规划之路
2014/01/01 职场文书
小学生安全保证书
2014/02/01 职场文书
合作经营协议书范本
2014/04/17 职场文书
消防安全承诺书
2014/05/22 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
质量保证书格式模板
2015/02/27 职场文书
高中运动会广播稿
2015/08/19 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL