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 相关文章推荐
网上应用的一个不错common.js脚本
Aug 08 Javascript
filters.revealTrans.Transition使用方法小结
Aug 19 Javascript
JS简单的轮播的图片滚动实例
Jun 17 Javascript
jQuery简单实现banner图片切换
Jan 02 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
Jan 14 Javascript
用jquery等比例控制图片宽高的具体实现
Jan 28 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
May 04 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
Nov 10 Javascript
Ajax实现不刷新取最新商品
Mar 01 Javascript
css和js实现弹出登录居中界面完整代码
Nov 26 Javascript
angular.js实现列表orderby排序的方法
Oct 02 Javascript
利用原生JavaScript实现造日历轮子实例代码
May 08 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
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
为你总结一些php系统类函数
2015/10/21 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
JavaScript如何操作css
2020/10/24 Javascript
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
详解Python3注释知识点
2019/02/19 Python
keras中的backend.clip用法
2020/05/22 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
德国综合购物网站:OTTO
2018/11/13 全球购物
思想汇报范文
2013/11/04 职场文书
旅游节目策划方案
2014/05/26 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
廉洁自律个人总结
2015/02/14 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书