原生js实现ajax请求和JSONP跨域请求操作示例


Posted in Javascript onMarch 14, 2020

本文实例讲述了原生js实现ajax请求和JSONP跨域请求。分享给大家供大家参考,具体如下:

直接上代码:

const ajax = (params = {}) => {
 const nowJson = params.jsonp ? jsonp(params) : json(params);
 function jsonp(params){
  //创建script标签并加入到页面中
  var callbackName = params.jsonp;
  var head = document.getElementsByTagName('head')[0];
  // 设置传递给后台的回调参数名
  params.data['callback'] = callbackName;
  var data = formatParams(params.data);
  var script = document.createElement('script');
  head.appendChild(script);
 
  window[callbackName] = function(jsonData) {
   head.removeChild(script);
   clearTimeout(script.timer);
   window[callbackName] = null;
   params.success && params.success(jsonData);
  };
  //console.log(window[callbackName])
  //console.log(params.url + '?' + data)
 
  //url形式传参
  //说明:下面的script加载资源后会返回一个自执行函数:[callbackName](responseData),这个形式就是去执行一个函数,函数的名字是一个参数
  //      同时在windows对象上定义了这个函数:[callbackName] = function(responseData){},这时就会调用这个函数
  script.src = params.url + '?' + data;
 
  //为了得知此次请求是否成功,设置超时处理
  if(params.time) {
   script.timer = setTimeout(function() {
    window[callbackName] = null;
    head.removeChild(script);
    params.error && params.error({
     message: '超时'
    });
   }, params.time);
  }
 }
 //格式化参数
 function formatParams(data) {
  var arr = [];
  for(var name in data) {
   arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
  };
 
  // 添加一个随机数,防止缓存
  arr.push('v=' + random());
  return arr.join('&');
 }
 
 // 获取随机数
 function random() {
  return Math.floor(Math.random() * 10000 + 500);
 }
 function json(params) {
  // 请求方式,默认是GET
  params.type = (params.type || 'GET').toUpperCase();
  // 避免有特殊字符,必须格式化传输数据
  params.data = formatParams(params.data);
  var xhr = null;
 
  // 实例化XMLHttpRequest对象
  if(window.XMLHttpRequest) {
   xhr = new XMLHttpRequest();
  } else {
   // IE6及其以下版本
   xhr = new ActiveXObjcet('Microsoft.XMLHTTP');
  };
 
  // 监听事件,只要 readyState 的值变化,就会调用 readystatechange 事件
  xhr.onreadystatechange = function() {
   // readyState属性表示请求/响应过程的当前活动阶段,4为完成,已经接收到全部响应数据
   if(xhr.readyState == 4) {
    var status = xhr.status;
    // status:响应的HTTP状态码,以2开头的都是成功
    if(status >= 200 && status < 300) {
     var response = '';
     // 判断接受数据的内容类型
     var type = xhr.getResponseHeader('Content-type');
     if(type.indexOf('xml') !== -1 && xhr.responseXML) {
      response = xhr.responseXML; //Document对象响应
     } else if(type === 'application/json') {
      response = JSON.parse(xhr.responseText); //JSON响应
     } else {
      response = xhr.responseText; //字符串响应
     };
     // 成功回调函数
     params.success && params.success(response);
    } else {
     params.error && params.error(status);
    }
   };
  };
 
  // 连接和传输数据
  if(params.type == 'GET') {
   // 三个参数:请求方式、请求地址(get方式时,传输数据是加在地址后的)、是否异步请求(同步请求的情况极少);
   xhr.open(params.type, params.url + '?' + params.data, true);
   xhr.send(null);
  } else {
   xhr.open(params.type, params.url, true);
   //必须,设置提交时的内容类型
   xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
   // 传输数据
   xhr.send(params.data);
  }
 }
}
export default ajax;

调用:

ajax({
   jsonp:'JSONP',
   url:'http://localhost:8080/test',
   data:{},
   time:1000,
   success:function(data){
    console.log(data)
   },
   error:function(error){
    console.log(error)
   }
  })

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
对new functionName()定义一个函数的理解
May 22 Javascript
jQuery分别获取选中的复选框值的示例
Jun 17 Javascript
jquery实现的Accordion折叠面板效果代码
Sep 02 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
Apr 11 Javascript
JavaScript实现简单的星星评分效果
May 18 Javascript
深入理解Angular.JS中的Scope继承
Jun 04 Javascript
深入理解Webpack 中路径的配置
Jun 17 Javascript
Vuejs 页面的区域化与组件封装的实现
Sep 11 Javascript
VUE 实现复制内容到剪贴板的两种方法
Apr 24 Javascript
vue v-for 使用问题整理小结
Aug 04 Javascript
在vscode 中设置 vue模板内容的方法
Sep 02 Javascript
Ajax获取node服务器数据的完整步骤
Sep 20 Javascript
js实现的订阅发布者模式简单示例
Mar 14 #Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 #Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 #Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 #Javascript
js中forEach,for in,for of循环的用法示例小结
Mar 14 #Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 #Javascript
JS数组的高级使用方法示例小结
Mar 14 #Javascript
You might like
第1次亲密接触PHP5(1)
2006/10/09 PHP
php获取淘宝分类id示例
2014/01/16 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
NodeJS和BootStrap分页效果的实现代码
2016/11/07 NodeJs
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
js实现开关灯效果
2020/03/30 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
如何基于js判断浏览器版本
2020/02/20 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python中实现常量(Const)功能
2015/01/28 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
python实现电子词典
2020/03/03 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
Python自省及反射原理实例详解
2020/07/06 Python
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
物流管理专业毕业生自荐信
2014/03/04 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
导游词之峨眉山
2019/12/16 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS