原生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 相关文章推荐
基于jquery的图片懒加载js
Jun 30 Javascript
JQuery Study Notes 学习笔记(一)
Aug 04 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
jsonp原理及使用
Oct 28 Javascript
JavaScript获取图片真实大小代码实例
Sep 24 Javascript
果断收藏9个Javascript代码高亮脚本
Jan 06 Javascript
JavaScript浏览器对象之一Window对象详解
Jun 03 Javascript
JavaScript里 ==与===区别详解
Aug 16 Javascript
javascript中的后退和刷新实现方法
Nov 10 Javascript
angular或者js怎么确定选中ul中的哪几个li
Aug 16 Javascript
详解Vue文档中几个易忽视部分的剖析
Mar 24 Javascript
Vue使用NProgress进度条的方法
Sep 21 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
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
python正则表达式抓取成语网站
2013/11/20 Python
Python实现115网盘自动下载的方法
2014/09/30 Python
python生成随机mac地址的方法
2015/03/16 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
简单的Python人脸识别系统
2020/07/14 Python
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
服装设计专业毕业生推荐信
2013/11/09 职场文书
三好学生自我鉴定
2013/12/17 职场文书
大四学生思想汇报
2014/01/13 职场文书
入股协议书范本
2014/04/14 职场文书
转让协议书范本
2014/04/15 职场文书
计算机多媒体专业自荐信
2014/07/04 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
评先进个人材料
2014/12/29 职场文书
停水通知
2015/04/16 职场文书