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 相关文章推荐
看了就知道什么是JSON
Dec 09 Javascript
Javascript 表单之间的数据传递代码
Dec 04 Javascript
学习ExtJS TextField常用方法
Oct 07 Javascript
JS 无法通过W3C验证的处理方法
Mar 09 Javascript
jquery异步跨域访问代码
Jun 28 Javascript
javascript运行机制之this详细介绍
Feb 07 Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 Javascript
jQuery+正则+文本框只能输入数字的实现方法
Oct 07 Javascript
微信小程序 图片边框解决方法
Jan 16 Javascript
AngularJS中ng-class用法实例分析
Jul 06 Javascript
layui table 列宽百分比显示的实现方法
Sep 28 Javascript
vue实现数字滚动效果
Jun 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
PHP中的string类型使用说明
2010/07/27 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php下获取http状态的实现代码
2014/05/09 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
Python如何实现强制数据类型转换
2019/11/22 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
python内置模块collections知识点总结
2019/12/19 Python
python文件和文件夹复制函数
2020/02/07 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
新郎婚宴答谢词
2014/01/19 职场文书
高中生班主任评语
2014/04/25 职场文书
爱国演讲稿400字
2014/05/07 职场文书
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python