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 相关文章推荐
javascritp实现input输入框相关限制用法
Jun 29 Javascript
js加密解密字符串可自定义密码因子
May 13 Javascript
jQuery中find()方法用法实例
Jan 07 Javascript
JavaScript计算两个日期时间段内日期的方法
Mar 16 Javascript
使用jquery清空、复位整个输入域
Apr 02 Javascript
文字垂直滚动之javascript代码
Jul 29 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
javascript定时器取消定时器及优化方法
Jul 08 Javascript
微信通过页面(H5)直接打开本地app的解决方法
Sep 09 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
Dec 24 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
Mar 06 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实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
php实现的验证码文件类实例
2015/06/18 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
PHP CURL使用详解
2019/03/21 PHP
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
Python中文件操作简明介绍
2015/04/13 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Python GUI编程完整示例
2019/04/04 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
应届生如何写自荐信
2014/01/05 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
十一酒店活动方案
2014/02/20 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技