js跨域请求数据的3种常用的方法


Posted in Javascript onDecember 01, 2015

由于js同源策略的影响,当在某一域名下请求其他域名,或者同一域名,不同端口下的url时,就会变成不被允许的跨域请求。
那这个时候通常怎么解决呢,对此菜鸟光头我稍作了整理:
1.JavaScript
   在原生js(没有jQuery和ajax支持)的情况下,通常客户端代码是这样的(我假设是在localhost:8080的端口下的http://localhost:8080/webs/i.mediapower.mobi/wutao/index.html页面的body标签下面加入以下代码):

<script>
  var xhr = new XMLHttpRequest();
  xhr.open("get", "http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js", true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
      console.log(xhr.responseText);
    }
  };
  xhr.send(null);
</script>

保存,浏览器打开http://localhost:8080/webs/i.mediapower.mobi/wutao/index.html,并且打开console控制台:

js跨域请求数据的3种常用的方法

浏览器很无情的给你弹出一个同源限制的错误,意思就是你无法跨域请求url的数据。
那么,我先采取第一种策略,运用html中的script标签,插入js脚本:
(1)通过script标签引用,写死你需要的src的url地址,比如:

<script>
var callbackfunction = function(data) {
  console.log('我是跨域请求来的数据-->' + data.name);
};
</script>
<script src="http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js?callback=callbackfunction"></script>

这里我定义一个callbackfunction的函数,然后用script标签的src属性跨域请求数据,那么,test.js的内容经过约定,需要写成这样:
callbackfunction({"name":"wwwwwwwwwwww"});
保存,打开index.html并刷新:

js跨域请求数据的3种常用的方法

(2)你也可以动态的加入script标签,让html解析的时候,动态的加载script脚本,并请求远端数据:

<script>
var callbackfunction = function(data) {
  console.log('我是跨域请求来的数据-->' + data.name);
};
var script = document.createElement('script'),
  body = document.getElementsByTagName('body');

script.src = 'http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js?callback=callbackfunction';
body[0].appendChild(script);
</script>

结果和上面一样。

 js跨域请求数据的3种常用的方法

2.jQuery中的$.ajax()

   设想,当你想要使用jQuery请求跨域数据的时候,比如(还是刚才的index.html):

<script src="js/jquery-1.11.3.js"></script>
<script>
$(function(){
  $.get('http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js',function(data){
    console.log(data);
  })
})
</script>

浏览器还是无情的报错,因为你这个url是不同的域名下的。

那么既然jQuery封装了ajax方法,我们为何不用,人家封装好了,你不用,岂不是找罪受么,代码如下:

<script src="js/jquery-1.11.3.js"></script>
<script>
$(function(){
  $.ajax({
    async: false,
    type: "GET",
    dataType: 'jsonp',
    jsonp: 'callback',
    jsonpCallback: 'callbackfunction',
    url: "http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js",
    data: "",
    timeout: 3000,
    contentType: "application/json;utf-8",
    success: function(msg) {
      console.log(msg);
    }
  });
})
</script>

js跨域请求数据的3种常用的方法

当你作了这么多挑逗工作之后,浏览器很爽快的给出了反应,表示它很爽,返回给了你一个对象,里面是远端不同域名下test.js中的数据。
3.postMessage+iframe

   postMessage是HTML5中新增加的功能,比如我在本地域名下,http://192.168.1.152:8080/webs/i.mediapower.mobi/wutao/testa.html中的testa.html中:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>testa</title>
</head>
<script>
window.onload = function() {
  document.getElementById('ifr').contentWindow.postMessage('我是要经过传递的数据', 'http://i2.mediapower.mobi/adpower/vm/Bora/testb.html');
};
</script>
<body>
  <iframe id="ifr" src="http://i2.mediapower.mobi/adpower/vm/Bora/testb.html"></iframe>
</body>
</html>

此时,我远端的testb.html里面的内容应该是这样:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>testb</title>
</head>
<script>
window.addEventListener('message', function(event) {
  // 通过origin属性判断消息来源地址
  if (event.origin === 'http://192.168.1.152:8080') {
    alert(event.data); 
  }
}, false);
</script>
<body>
123
</body>
</html>

保存代码,打开本地testa.html,访问远端的testb.html

js跨域请求数据的3种常用的方法

总结了一下,jQuery还是非常的好用的,基本上js能干的事情,jQuery都能非常快速并且高效的完成,当然,原生js也能解决很多事情,而HTML5的新功能也非常强大,这几种方法,我还是首推jQuery。

以上就是为大家分享的3种常用的js跨域请求数据的方法,希望对大家的学习有所帮助。

Javascript 相关文章推荐
Javascript Select操作大集合
May 26 Javascript
一些主流JS框架中DOMReady事件的实现小结
Feb 12 Javascript
bootstrap改变按钮加载状态
Dec 01 Javascript
jQuery UI设置固定日期选择特效代码分享
Aug 27 Javascript
JavaScript对象参数的引用传递
Jan 14 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
使用原生js封装的ajax实例(兼容jsonp)
Oct 12 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
Apr 21 Javascript
Layer弹出层动态获取数据的方法
Aug 20 Javascript
vue + elementUI实现省市县三级联动的方法示例
Oct 29 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
解决vue项目中出现Invalid Host header的问题
Nov 17 Javascript
jQuery插件实现多级联动菜单效果
Dec 01 #Javascript
基于Jquery实现焦点图淡出淡入效果
Nov 30 #Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
Nov 30 #Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
Nov 30 #Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
Nov 30 #Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
Nov 30 #Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
Nov 30 #Javascript
You might like
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
从零开始封装自己的自定义Vue组件
2018/10/09 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
python安装教程 Pycharm安装详细教程
2017/05/02 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
Python实现时间序列可视化的方法
2019/08/06 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
意大利奢侈品网站:Italist
2016/08/23 全球购物
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
旅游专业毕业生自荐书
2014/06/30 职场文书
酒店端午节活动方案
2014/08/26 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
政协会议宣传标语
2014/10/09 职场文书
原告离婚代理词
2015/05/23 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android