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 相关文章推荐
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
Nov 27 Javascript
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
jquery动态更换设置背景图的方法
Mar 25 Javascript
Javascript仿PHP $_GET获取URL中的参数
May 12 Javascript
js简单实现竖向tab选项卡的方法
May 04 Javascript
JavaScript中的this关键字使用详解
Aug 14 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
Aug 05 Javascript
BACKBONE.JS 简单入门范例
Oct 17 Javascript
vue 实现复制内容到粘贴板clipboard的方法
Mar 17 Javascript
vue+axios+mock.js环境搭建的方法步骤
Aug 28 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
Mar 29 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 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
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
WordPress的主题编写中获取头部模板和底部模板
2015/12/28 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
Python中元组,列表,字典的区别
2017/05/21 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
教育专业自荐书范文
2013/12/17 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
专家推荐信模板
2014/05/09 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
pytorch中的model=model.to(device)使用说明
2021/05/24 Python
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL