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的类继承
Mar 05 Javascript
jQuery 阴影插件代码分享
Jan 09 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
Jan 03 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
Mar 10 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
Nov 30 Javascript
基于jquery实现三级下拉菜单
May 10 Javascript
修改Jquery Dialog 位置的实现方法
Aug 26 Javascript
微信小程序 http请求详细介绍
Oct 09 Javascript
利用vscode调试编译后的js代码详解
May 14 Javascript
小程序开发基础之view视图容器
Aug 21 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 Javascript
Nuxt v-bind绑定img src不显示的解决
Dec 05 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生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
Yii2如何批量添加数据
2016/05/17 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
js精度溢出解决方案
2012/12/02 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
Python日志模块logging简介
2015/04/13 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python返回数组/List长度的实例
2018/06/23 Python
Flask之请求钩子的实现
2018/12/23 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
上课迟到检讨书
2014/01/19 职场文书
运输服务质量承诺书
2014/03/27 职场文书
搞笑结婚保证书
2015/05/08 职场文书
2015年档案室工作总结
2015/05/23 职场文书
投诉信回复范文
2015/07/03 职场文书
导游词之峨眉山
2019/12/16 职场文书
Python面试不修改数组找出重复的数字
2022/05/20 Python