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 相关文章推荐
推荐20家国外的脚本下载网站
Apr 28 Javascript
javascript简易缓动插件(源码打包)
Feb 16 Javascript
JS设置获取cookies的方法
Jan 26 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
Aug 25 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
Feb 18 Javascript
vue快捷键与基础指令详解
Jun 01 Javascript
全选复选框JavaScript编写小结(附代码)
Aug 16 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 Javascript
layui use 定义js外部引用函数的方法
Sep 26 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 批量删除 sql语句
2009/06/05 PHP
PHP递归创建多级目录
2015/11/05 PHP
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
原生js调用json方法总结
2018/02/22 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
Python实现学校管理系统
2018/01/11 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
python同步两个文件夹下的内容
2019/08/29 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
销售工作岗位职责
2013/12/24 职场文书
留学推荐信怎么写
2014/01/25 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
社区党员干部承诺书
2015/05/04 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
python中的3种定义类方法
2021/11/27 Python