原生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 相关文章推荐
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
Jquery Uploadify上传带进度条的简单实例
Feb 12 Javascript
jQuery实现数字加减效果汇总
Dec 16 Javascript
跟我学习javascript的call(),apply(),bind()与回调
Nov 16 Javascript
JavaScript 实现的checkbox经典实例分享
Oct 16 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
深入理解javascript中concat方法
Dec 12 Javascript
利用Vue.js实现求职在线之职位查询功能
Jul 03 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
May 31 Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
Jul 21 Javascript
原生JS实现音乐播放器的示例代码
Feb 25 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
PHP6 mysql连接方式说明
2009/02/09 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
js模仿java的Map集合详解
2016/01/06 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
Angular工具方法学习
2016/12/26 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
python输入多行字符串的方法总结
2019/07/02 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
本科生个人求职自荐信
2013/09/26 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
公司员工检讨书
2014/02/08 职场文书
团日活动总结
2014/04/28 职场文书
师德师风个人反思
2014/04/28 职场文书
解除财产保全担保书
2014/05/20 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
小孩不笨观后感
2015/06/03 职场文书