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 相关文章推荐
从零开始学习jQuery (二) 万能的选择器
Oct 01 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
jQuery多条件筛选如何实现
Nov 04 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
Nov 24 Javascript
Linux CentOS系统下安装node.js与express的方法
Apr 01 Javascript
JavaScript的词法结构精华篇
Oct 17 Javascript
vuejs中父子组件之间通信方法实例详解
Jan 17 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
Feb 26 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
Mar 10 Javascript
微信小程序实现简单购物车功能
Dec 30 Javascript
JavaScript与JQuery框架基础入门教程
Jul 15 Javascript
canvas 中如何实现物体的框选
Aug 05 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/10/09 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
Node.js文件操作详解
2014/08/16 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
实例浅析js的this
2016/12/11 Javascript
js获取ip和地区
2017/03/10 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
Python安装第三方库的3种方法
2015/06/21 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
python实现代码统计程序
2019/09/19 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
好听的队名和口号
2014/06/09 职场文书
应用心理学专业求职信
2014/08/04 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
实名检举信范文
2015/03/02 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
python 对图片进行简单的处理
2021/06/23 Python