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 相关文章推荐
基于jquery的大众点评,分类导航实现代码
Aug 23 Javascript
图片Slider 带左右按钮的js示例
Aug 30 Javascript
JavaScript的null和undefined区别示例介绍
Sep 15 Javascript
JS判断客服QQ号在线还是离线状态的方法
Jan 13 Javascript
微信小程序 数据访问实例详解
Oct 08 Javascript
js canvas实现QQ拨打电话特效
May 10 Javascript
jquery实现限制textarea输入字数的方法
Sep 06 jQuery
日期时间范围选择插件:daterangepicker使用总结(必看篇)
Sep 14 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
Jul 13 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
Apr 26 Javascript
解决vue.js提交数组时出现数组下标的问题
Nov 05 Javascript
vue实现pdf文档在线预览功能
Nov 26 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP微信红包生成代码分享
2016/10/06 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
JavaScript 学习笔记(六)
2009/12/31 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
python回调函数的使用方法
2014/01/23 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
pandas带有重复索引操作方法
2018/06/08 Python
Python 爬虫性能相关总结
2020/08/03 Python
Python如何操作docker redis过程解析
2020/08/10 Python
美国保健品专家:Life Extension
2018/05/04 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
安全大检查实施方案
2014/02/22 职场文书
分析Python list操作为什么会错误
2021/11/17 Python
排查Tomcat进程假死的问题
2022/05/06 Servers
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技