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 限制输入和粘贴(IE,firefox测试通过)
Nov 14 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
Dec 25 Javascript
js constructor的实际作用分析
Nov 15 Javascript
javascript通过navigator.userAgent识别各种浏览器
Oct 25 Javascript
node.js不得不说的12点内容
Jul 14 Javascript
jQuery Validate 校验多个相同name的方法
May 18 jQuery
JavaScript编写棋盘覆盖代码详解
Aug 28 Javascript
AjaxUpLoad.js实现文件上传功能
Mar 02 Javascript
node.js读取Excel数据(下载图片)的方法示例
Aug 02 Javascript
对vue中methods互相调用的方法详解
Aug 30 Javascript
Vue实现滑动拼图验证码功能
Sep 15 Javascript
使用layer弹窗,制作编辑User信息页面的方法
Sep 27 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
PHP 高手之路(一)
2006/10/09 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Python中规范定义命名空间的一些建议
2016/06/04 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
python实现log日志的示例代码
2018/04/28 Python
python opencv实现证件照换底功能
2019/08/19 Python
详解python中eval函数的作用
2019/10/22 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
小学生自我评价范文
2014/01/25 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
监考失职检讨书
2015/01/26 职场文书
销售辞职信范文
2015/03/02 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
党支部半年考察意见
2015/06/01 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP