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 相关文章推荐
写的htc的数据表格
Jan 20 Javascript
又一个小巧的图片预加载类
May 05 Javascript
使用jQuery清空file文件域的解决方案
Apr 12 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
Aug 05 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
Aug 02 Javascript
JavaScript与java语言有什么不同
Sep 22 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
Jan 10 Javascript
bootstrap按钮插件(Button)使用方法解析
Jan 13 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
Aug 24 Javascript
vue中如何使用ztree
Feb 06 Javascript
vscode中Vue别名路径提示的实现
Jul 31 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
坏狼的PHP学习教程之第1天
2008/06/15 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
详解jQuery中的事件
2016/12/14 Javascript
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
跟老齐学Python之复习if语句
2014/10/02 Python
Python实现去除代码前行号的方法
2015/03/10 Python
对Python中的@classmethod用法详解
2018/04/21 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python返回数组的索引实例
2019/11/28 Python
关于多元线性回归分析——Python&amp;SPSS
2020/02/24 Python
HTML5中5个简单实用的API
2014/04/28 HTML / CSS
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
新生儿未入户证明
2015/06/23 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript