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 触发a链接点击事件解决方案
May 02 Javascript
Extjs NumberField后面加单位实现思路
Jul 30 Javascript
通过复制Table生成word和excel的javascript代码
Jan 20 Javascript
IE中getElementsByName()对有些元素无效的解决方案
Sep 28 Javascript
javascript实现控制的多级下拉菜单
Jul 05 Javascript
jQuery插件pagination实现无刷新分页
May 21 Javascript
canvas实现十二星座星空图
Feb 14 Javascript
jQuery.ajax向后台传递数组问题的解决方法
May 12 jQuery
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
解决vue-router进行build无法正常显示路由页面的问题
Mar 06 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
Jul 27 Javascript
JavaScript实现简单图片切换
Apr 29 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 json_encode值中大括号与花括号区别
2013/09/30 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
使用PHP编写发红包程序
2015/07/22 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
mouse_on_title.js
2006/08/25 Javascript
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
财务助理岗位职责
2013/11/10 职场文书
周年庆促销方案
2014/03/15 职场文书
技校毕业生自荐信
2014/06/03 职场文书
教师求职自荐书
2014/06/14 职场文书
小学校本教研总结
2015/08/13 职场文书