以下的例子包含的文件均为为 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标签没有跨域限制的特性,通过在srcurl的参数上附加回调函数名字,然后服务器接收回调函数名字并返回一个包含数据的回调函数

  1. function doSomething(data) {
  2. // 对data处理
  3. }
  4. var script = document.createElement("script");
  5. script.src = "http://www.b.com/b.html?callback=doSomething";
  6. document.body.appendChild(script);
  7.  
  8. // 1.生成一个script标签,将其append在body上,向服务器发出请求
  9. // 2.服务器根据 callback 这个参数生成一个包含数据的函数 doSomething({"a", "1"})
  10. // 3.页面事先已声明doSomething函数,此时执行 doSomething(data) 这个函数,获得数据

2.HTML5的postMessage

假设在a.html里嵌套个<iframe src="http://www.b.com/b.html" frameborder="0"></iframe>,在这两个页面里互相通信

a.html

  1. window.onload = function() {
  2. window.addEventListener("message", function(e) {
  3. alert(e.data);
  4. });
  5.  
  6. window.frames[0].postMessage("b data", "http://www.b.com/b.html");
  7. }

b.html

  1. window.onload = function() {
  2. window.addEventListener("message", function(e) {
  3. alert(e.data);
  4. });
  5. window.parent.postMessage("a data", "http://www.a.com/a.html");
  6. }

这样打开a页面就先弹出 a data,再弹出 b data

3.window.name + iframe

window.name的原理是利用同一个窗口在不同的页面共用一个window.name,这个需要在a.com下建立一个代理文件c.html,使同源后a.html能获取c.htmlwindow.name

a.html

  1. var iframe = document.createElement("iframe");
  2. iframe.src = "http://www.b.com/b.html";
  3. document.body.appendChild(iframe); // 现在a.html里建一个引用b.html的iframe,获得b的数据
  4.  
  5. var flag = true;
  6. iframe.onload = function() {
  7. if (flag) {
  8. iframe.src = "c.html";
  9. // 判断是第一次载入的话,设置代理c.html使和a.html在同目录同源,这样才能在下面的else取到data
  10. flag = false;
  11. } else { // 第二次载入由于a和c同源,a可以直接获取c的window.name
  12. alert(iframe.contentWindow.name);
  13.  
  14. iframe.contentWindow.close();
  15. document.body.removeChild(iframe);
  16. iframe.src = '';
  17. iframe = null;
  18. }
  19. }

b.html

  1. window.name = "这是 b 页面的数据";
  1.  

4.window.location.hash + iframe

b.html将数据以hash值的方式附加到c.htmlurl上,在c.html页面通过location.hash获取数据后传到a.html(这个例子是传到a.htmlhash上,当然也可以传到其他地方)

a.html

  1. var iframe = document.createElement("iframe");
  2. iframe.src = "http://www.b.com/b.html";
  3. document.body.appendChild(iframe); // 在a页面引用b
  4. function check() { // 设置个定时器不断监控hash的变化,hash一变说明数据传过来了
  5. var hashs = window.location.hash;
  6. if (hashs) {
  7. clearInterval(time);
  8. alert(hashs.substring(1));
  9. }
  10. }
  11. var time = setInterval(check, 30);

b.html

  1. window.onload = function() {
  2. var data = "this is b's data";
  3. var iframe = document.createElement("iframe");
  4. iframe.src = "http://www.a.com/c.html#" + data;
  5. document.body.appendChild(iframe); // 将数据附加在c.html的hash上
  6. }
  1.  

c.html

  1. // 获取自身的hash再传到a.html的hash里,数据传输完毕
  2. parent.parent.location.hash = self.location.hash.substring(1);
  1.  

5.CORS

CORSXMLHttpRequest Level 2 里规定的一种跨域方式。在支持这个方式的浏览器里,javascript的写法和不跨域的ajax写法一模一样,只要服务器需要设置Access-Control-Allow-Origin: *

6.document.domain

这种方式适用于主域相同,子域不同,比如http://www.a.comhttp://b.a.com
假如这两个域名下各有a.html 和b.html,

a.html

  1. document.domain = "a.com";
  2. var iframe = document.createElement("iframe");
  3. iframe.src = "http://b.a.com/b.html";
  4. document.body.appendChild(iframe);
  5. iframe.onload = function() {
  6. console.log(iframe.contentWindow....); // 在这里操作b.html里的元素数据
  7. }
  1.  

b.html

  1. document.domain = "a.com";
  1.  

注意:document.domain需要设置成自身或更高一级的父域,且主域必须相同。

javascript跨域的几种方法的更多相关文章

  1. javascript 跨域 的几种方法

      1.jsonp方法 转:https://blog.csdn.net/liusaint1992/article/details/50959571 主要实现功能: 1.参数拼装. 2.给每个回调函数唯 ...

  2. 实现跨域的N种方法

    从域说起 域: 域是WIN2K网络系统的安全性边界.我们知道一个计算机网最基本的单元就是"域",这一点不是WIN2K所独有的,但活动目录可以贯穿一个或多个域.在独立的计算机上,域即 ...

  3. vue开发环境和生产环境里面解决跨域的几种方法

    什么是跨域   跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据.源指协议,端口,域名.只要这个3个中有一个不同就是跨域. 这里列举一个经典的列子: #协议跨域 http://a.baidu. ...

  4. AJAX实现跨域的三种方法

    由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问. 比如说你的网站域名是aaa.com,想要通过AJAX请 ...

  5. Ajax跨域的几种方法以及每种方法的原理

    js中几种实用的跨域方法原理详解 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协 ...

  6. js常用代码示例及解决跨域的几种方法

    1.阻止默认行为 // 原生js document.getElementById('btn').addEventListener('click', function (event) { event = ...

  7. 后端跨域的N种方法

    简单来说,CORS是一种访问机制,英文全称是Cross-Origin Resource Sharing,即我们常说的跨域资源共享,通过在服务器端设置响应头,把发起跨域的原始域名添加到Access-Co ...

  8. spring boot 解决 跨域 的两种方法 -- 前后端分离

    1.前言 以前做项目 ,基本上是使用 MVC 模式 ,使得视图与模型绑定 ,前后端地址与端口都一样 , 但是现在有些需求 ,需要暴露给外网访问 ,那么这就出现了个跨域问题 ,与同源原则冲突, 造成访问 ...

  9. .net设置浏览器缓存和跨域的几种方法

    .自定义过滤器属性 public class NoCacheAttribute : FilterAttribute, IActionFilter { public void OnActionExecu ...

随机推荐

  1. hdu2008 数值统计【C++】

    数值统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. Curious Cupid

    There are K different languages in the world. Each person speaks one and only one language. There ar ...

  3. Object Detection: To Be Higher Accuracy and Faster

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51597496 在深度学习中有一类研究热 ...

  4. 开启mysql远程连接

    mysql默认只允许本地连接,也就是说,在安装完mysql后会存在两个root账户,他们的host分别是localhost和127.0.0.1 use mysql; update user set h ...

  5. LINUX 内核 图 外国牛人

    http://duartes.org/gustavo/blog/ http://blog.csdn.net/drshenlei

  6. ELECTRON新增模块的方法

    因为electron和node.js用的V8版本不一致,所以直接使用npm安装的模块可能在electron中不可用,特别是使用c.c++开发的模块.官方的说明:https://github.com/e ...

  7. HDU 5293

    树上DP题. 其实有点类似于01的问题.方程很容易想到.首先,因为一条链的节点其实都是在树上的,所以很容易想到应该先求一个LCA.然后,当某节点不是链的LCA时,它的转移就是: dp[i]=sum[i ...

  8. 开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据

    项目地址:http://www.freeteam.cn/ 生成栏目列表数据 提取当前管理网站下同意移动APP訪问的栏目列表,生成json数据到/site/网站文件夹/mobile/channels.h ...

  9. hdu5119 Happy Matt Friends(dp)

    题目链接:点击打开链接 题目描写叙述:给出n个数.求从这n个数中随意取出一些数(至少取一个)相互异或之后大于m的方案数? 解题思路:分析因为n<=40&&m<=10^6,因 ...

  10. jquery.validate.js插件的使用方法

    近期做项目.须要用到 jQuery.validate.js插件,于是记录一下工作中的一些经验,以便日后学习. [样例例如以下] 1.前台页面 <form id="form1" ...