原生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 相关文章推荐
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
js 日期比较相关天数代码
Apr 02 Javascript
javascript使用call调用微信API
Dec 15 Javascript
JS中setTimeout的巧妙用法前端函数节流
Mar 24 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
Jun 20 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
Apr 26 Javascript
微信小程序日历组件calendar详解及实例
Jun 08 Javascript
CSS3+JavaScript实现翻页幻灯片效果
Jun 28 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
Dec 26 Javascript
Angular利用trackBy提升性能的方法
Jan 26 Javascript
简述ES6新增关键字let与var的区别
Aug 23 Javascript
解决layer弹出层自适应页面大小的问题
Sep 16 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
高亮度显示php源代码
2006/10/09 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
JS获取整个页面文档的实现代码
2011/12/15 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
python实现装饰器、描述符
2018/02/28 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
python实现图片转字符小工具
2019/04/30 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
Python算法中的时间复杂度问题
2019/11/19 Python
pycharm修改file type方式
2019/11/19 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
致运动员赞词
2015/07/22 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
python面向对象版学生信息管理系统
2021/06/24 Python