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 Discuz代码中的msn聊天小功能
May 25 Javascript
传递参数的标准方法(jQuery.ajax)
Nov 19 Javascript
对字符串进行HTML编码和解码的JavaScript函数
Feb 01 Javascript
javascript判断用户浏览器插件安装情况的代码
Jan 01 Javascript
jquery无限级联下拉菜单简单实例演示
Nov 23 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
Dec 07 Javascript
javascript中FOREACH数组方法使用示例
Mar 01 Javascript
Javascript循环删除数组中元素的几种方法示例
May 18 Javascript
javascript将list转换成树状结构的实例
Sep 08 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
Aug 31 Javascript
vue中子组件传递数据给父组件的讲解
Jan 27 Javascript
js实现带有动画的返回顶部
Aug 09 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截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
python使用心得之获得github代码库列表
2014/06/25 Python
Python的动态重新封装的教程
2015/04/11 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
Python实现画图软件功能方法详解
2020/07/28 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
网络事业创业计划书范文
2014/01/09 职场文书
光盘行动倡议书
2014/02/02 职场文书
2014年国培研修感言
2014/03/09 职场文书
运动会开幕式致辞
2015/07/29 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技