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实现UrlEncode和UrlDecode的脚本代码
Jul 23 Javascript
js各种验证文本框输入格式(正则表达式)
Oct 22 Javascript
javascript中验证大写字母、数字和中文
Jan 15 Javascript
jquery如何获取元素的滚动条高度等实现代码
Oct 19 Javascript
jquery模拟实现鼠标指针停止运动事件
Jan 12 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
Mar 17 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
Apr 12 Javascript
vue的基本用法与常见指令
Aug 15 Javascript
浅谈在koa2中实现页面渲染的全局数据
Oct 09 Javascript
TS 类型兼容教程示例详解
Sep 23 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
1 Tube Radio
2021/03/02 无线电
建立文件交换功能的脚本(一)
2006/10/09 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
jquery操作cookie插件分享
2014/01/14 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
教师自我反思材料
2014/02/14 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
演讲稿开场白台词
2014/08/25 职场文书
学生检讨书怎么写
2015/05/07 职场文书
食品安全责任书范本
2015/05/09 职场文书