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 相关文章推荐
改善你的jQuery的25个步骤 千倍级效率提升
Feb 11 Javascript
ExtJS 下拉多选框lovcombo
May 19 Javascript
数组方法解决JS字符串连接性能问题有争议
Jan 12 Javascript
AngularJS入门教程之学习环境搭建
Dec 06 Javascript
jquery动画效果学习笔记(8种效果)
Nov 13 Javascript
js实现适合新闻类图片的轮播效果
Feb 05 Javascript
HTML的select控件美化
Mar 27 Javascript
bootstrap suggest下拉框使用详解
Apr 10 Javascript
详解Vue 非父子组件通信方法(非Vuex)
May 24 Javascript
vue左侧菜单,树形图递归实现代码
Aug 24 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
Sep 15 Javascript
浅谈微信页面入口文件被缓存解决方案
Sep 29 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开发中的错误收集,不定期更新。
2011/02/03 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
django 信号调度机制详解
2019/07/19 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
建筑设计所实习生自我鉴定
2013/09/25 职场文书
致标枪运动员加油稿
2014/02/15 职场文书
省文明单位申报材料
2014/05/08 职场文书
个人总结怎么写
2015/02/26 职场文书
英语通知范文
2015/04/22 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
2016年元旦寄语
2015/08/17 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
导游词之湖州-太湖
2019/10/11 职场文书
详解Redis瘦身指南
2021/05/26 Redis
MongoDB数据库的安装步骤
2021/06/18 MongoDB