方法一:HTML5新的标准中,增加了” Cross-Origin Resource Sharing”特性,这个特性的出现使得跨域通信只需通过配置http协议头来即可解决。

Cross-Origin Resource Sharing 详细解释见:
http://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html

Cross-Origin Resource Sharing实现的最重要的一点就是对参数” Access-Control-Allow-Origin”的配置,即通过 次参数检查该跨域请求是否可以被通过。
如:Access-Control-Allow-Origin:http://a.com表示允许a.com下的域名跨域访问;
Access-Control-Allow-Origin:*表示允许所有的域名跨域访问。


如果需要读取读取cookie:
需要配置参数:Access-Control-Allow-Credentials:true
同时在xhr发起请求的时候设置参数withCredentials为true:
var xhr = new XMLHttpRequest();
xhr.open();
xhr.withCredentials = true; //这个放在xhr.open后面执行,否则有些浏览器部分版本会异常,导致设置无效。

示例代码:
php:

php

1
2
3
4
header('Access-Control-Allow-Origin:http: //a.com');
header('Access-Control-Allow-Methods:POST,GET');
header('Access-Control-Allow-Credentials:true'); 
echo'Cross-domain Ajax';

JS:

JavaScript

1
2
3
4
5
6
7
8
9
10
varxhr =newXMLHttpRequest(); ; 
xhr.open('GET','http: //b.com/cros/ajax.php',true);
xhr.withCredentials =true;
xhr.onload =function() {          
alert(xhr.response);//reposHTML;
};  
xhr.onerror =function() {
alert('error making the request.');
};
xhr.send();

方法二:使用postMessage实现Ajax跨域请求

1.  postMessage的用法

postMessage是HTML5为解决js跨域问题而引入的新的API,允许多个iframe/window跨域通信。

假设有结构如下:

test.html

Js代码   收藏代码
  1. <section id="wrapper">
  2. <header>
  3. <h1>postMessage (跨域)</h1>
  4. </header>
  5. <article>
  6. <form>
  7. <p>
  8. <label for="message">给iframe发一个信息:</label>
  9. <input type="text" name="message" value="son" id="message" />
  10. <input type="submit" />
  11. </p>
  12. </form>
  13. <h4>目标iframe传来的信息:</h4>
  14. <p id="test">暂无信息</p>
  15. <iframe id="iframe"
  16. src="http://xiebiji.com/works/postmessage/iframe.html"></iframe>
  17. </article>
  18. </section>

  

iframe.html

Js代码   收藏代码
  1. <strong>iframe指向xiebiji.com</strong>
  2. <form>
  3. <p>
  4. <label for="message">给父窗口发个信息:</label>
  5. <input type="text" name="message" value="dad" id="message" />
  6. <input type="submit" />
  7. </p>
  8. </form>
  9. <p id="test">暂无信息。</p>

下面是test.html里的Javascript代码(发送数据):

Js代码   收藏代码
  1. var win = document.getElementById("iframe").contentWindow;
  2. document.querySelector('form').οnsubmit=function(e){
  3. win.postMessage(document.getElementById("message").value,"*");
  4. if (e.preventDefault)
  5. e.preventDefault();
  6. e.returnValue = false;
  7. }

  关键代码就一句:

win.postMessage(document.getElementById("message").value,"*");

  postMessage是通信对象的一个方法,所以向iframe通信,就是iframe对象调用postMessage方法。postMessage有两个参数,缺一不可。第一个参数是要传递的数据,第二个参数是允许通信的域,“*”代表不对访问的域进行判断,可理解为允许所有域的通信。

  然后是iframe.html里侦听接收数据的代码:

Js代码   收藏代码
  1. var parentwin = window.parent;
  2. window.onmessage=function(e){
  3. document.getElementById("test").innerHTML = e.origin + "say:" + e.data;
  4. parentwin.postMessage('HI!你给我发了"<span>'+e.data+'"</span>。',"*");
  5. };

  很简单,相信一看就懂了。e.data包含传送过来的数据,e.origin指代源域。

然后iframe.html也给test.html发送回应的数据,test.html接收数据。代码雷同,就不贴代码了。

点此查看Demo(代码素Joe哥给的)
2. Ajax跨域请求

基于以上的跨域通信,只要将Ajax代码放在iframe.html里的onmessage处理函数里头,将test.html用postMessage传过来的数据作为参数发送请求,再将返回的数据用postMessage传给test.html。这样就实现了跨域的Ajax请求。其实是很简单的东西。

贴个示例代码吧,但跟以上的代码无关。

Js代码   收藏代码
  1. (function(){
  2. //获取跨域数据
  3. window.onmessage = function(e){
  4. var url = "http://yangzebo.com/demo/noforget/test.php?msg=" + e.data;
  5. //Ajax
  6. var xhr = getXHR();
  7. if(xhr){
  8. xhr.open("GET",url,true);
  9. xhr.onreadystatechange = changeHandle;
  10. xhr.send(null);
  11. }else{
  12. alert("不支持Ajax");
  13. }
  14. function changeHandle(){//返回处理
  15. if(xhr.readyState == 4){
  16. var parentwin = window.parent;
  17. parentwin.postMessage(xhr.responseText,"*");//跨域发送数据
  18. }
  19. }
  20. function getXHR(){//获取XMLHttpRequest
  21. var xhr_temp;
  22. if(window.XMLHttpRequest){
  23. xhr_temp = new XMLHttpRequest();
  24. }else if(window.ActiveXObject){
  25. xhr_temp = new ActiveXObject("Microsoft.XMLHTTP");
  26. }else{
  27. xhr_temp = null;
  28. }
  29. return xhr_temp;
  30. }
  31. };
  32. })();

HTML5 AJAX跨域请求相关推荐

  1. ajax跨域请求 html5,HTML5中使用postMessage实现Ajax跨域请求的方法

    由于同源策略的限制,Javascript存在跨域通信的问题,典型的跨域问题有iframe与父级的通信等. 常规的几种解决方法: (1) document.domain+iframe: (2) 动态创建 ...

  2. ajax跨域请求原理,Ajax跨域请求的原理(图文教程)

    这篇文章主要为大家详细介绍了Ajax跨域请求的原理,Ajax怎么样做跨域请求?具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Ajax跨域请求的具体实现过程,供大家参考,具体内容 ...

  3. jQuery中的ajax、jquery中ajax全局事件、load实现页面无刷新局部加载、ajax跨域请求jsonp、利用formData对象向服务端异步发送二进制数据,表单序列化(异步获取表单内容)

    jQuery中使用ajax: 在jQuery中使用ajax首先需要引入jQuery包,其引入方式可以采用网络资源,也可以下载包到项目文件中,这里推荐下载包到文件中:市面上有多个版本的jQuery库,这 ...

  4. 第114天:Ajax跨域请求解决方法(二)

    一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js   http:// (协议号)       www  (子 ...

  5. ajax 跨域请求数据,JQuery Ajax执行跨域请求数据的解决方案

    JQuery Ajax执行跨域请求数据的解决方案 今天前端因为需要ajax调用两个不同的项目,请求域不一样,所以涉及ajax跨域的问题 ,其实很简单,具体如下 原来的ajax请求如下: $.ajax( ...

  6. 将微博或者qq空间的说说同步至博客园 wcf+js(ajax)跨域请求(1)

    前天刚写了篇文章使用Bootstrap为你的博客园自定义轮播图片(今天将图片加载的顺序调整了下,不在访问的时候直接加载,而是页面加载最后在脚本里面动态添加dom元素),虽说技术含量不怎么高,但是大家还 ...

  7. js请求结果拦截机器_js利用jquery的jsonp来解决ajax跨域请求被浏览器拦截结果的问题...

    先来个表.页面太多对不起我也不知道这张表是从哪个博客保存过来的,所以无法注明博客地址.非常抱歉.URL说明是否允许通信 http://www.a.com/a.jshttp://www.a.com/b. ...

  8. JSONP实现Ajax跨域请求

    前言 由于浏览器存在同源策略的机制,所谓同源策略就是阻止从一个源(域名,包括同一个根域名下的不同二级域名)加载的文档或者脚本获取/或者设置另一个源加载的文档属性. 但比较特别的是:由于同源策略是浏览器 ...

  9. 用iframe设置代理解决ajax跨域请求问题

    用iframe设置代理解决ajax跨域请求问题 参考文章: (1)用iframe设置代理解决ajax跨域请求问题 (2)https://www.cnblogs.com/ranzige/p/370965 ...

最新文章

  1. linux内网机器访问外网代理设置squid
  2. zookeeper3.4集群搭建
  3. 胆固醇竟是新冠最隐蔽同伙!协助病毒入侵细胞,普林斯顿、哈佛医学院首次观察到全过程...
  4. 安装中文版man手册,同时保留原英文版手册
  5. java.net.URISyntaxException的解决办法
  6. PE学习(十一)第十一章:动态加载技术
  7. Android Cursor类的概念和用法
  8. 提高数据库处理查询速度
  9. Objective-C和C++混编的要点
  10. 【体系结构】Oracle的kernel.shmmax和kernel.shmall设置
  11. 西门子S7-1200、1500固件更新第三方设备GSD导入
  12. SQL数据库连接失败
  13. elementUI使用el-tabs时,页面崩溃卡死问题
  14. 学海无涯!腾讯、网易必问的20道题Android面试题,已拿offer入职
  15. 密码加盐(salt)
  16. php int 32 64,php从32位升级到64位需要注意的几点
  17. CSS的类名命名规范
  18. 千锋教育威哥学Java教程之Java基础学习路线
  19. 屏幕分辨率及衬线字体
  20. 【20220501】众人眼中的架构师

热门文章

  1. 测试用例的设计方法!
  2. 中国石油大学(北京)-《外国文学作品选读》第一阶段在线作业
  3. 转:九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)
  4. 毕业论文-马尔可夫随机场
  5. 高通量测序在物种鉴定中的应用
  6. 【Matlab语音分析】语音信号分析【含GUI源码 1718期】
  7. 实验:使用SSMS创建并管理数据库及其基本表(代码版)
  8. Python的就业方向、薪资,学完前景怎么样?
  9. 网络分析仪测试线损_关于网络分析仪的测试(校准线损问题)
  10. HTTPS抓包连接过程