原生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 相关文章推荐
用javascript获取textarea中的光标位置
May 06 Javascript
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
jQuery基于cookie实现的购物车实例分析
Dec 24 Javascript
AngularJS 最常用的八种功能(基础知识)
Jun 26 Javascript
JS实现中文汉字按拼音排序的方法
Oct 09 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
JS使用数组实现的队列功能示例
Mar 04 Javascript
微信小程序常用赋值方法小结
Apr 30 Javascript
Vue修改项目启动端口号方法
Nov 07 Javascript
vue学习笔记之slot插槽用法实例分析
Feb 29 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在不同页面间传递Json数据示例代码
2013/06/08 PHP
解析php常用image图像函数集
2013/06/24 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
分页栏的web标准实现
2011/11/01 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
2014年保险业务员工作总结
2014/12/23 职场文书
文明班级申报材料
2014/12/24 职场文书
公路施工安全责任书
2015/05/08 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
基于Python实现流星雨效果的绘制
2022/03/18 Python