原生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模拟按下回车实现代码
Sep 20 Javascript
jquery 无限级联菜单案例分享
Mar 26 Javascript
javascript自定义startWith()和endWith()的两种方法
Nov 11 Javascript
javascript面向对象之定义成员方法实例分析
Jan 13 Javascript
再谈JavaScript异步编程
Jan 27 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 Javascript
VueJs 将接口用webpack代理到本地的方法
Nov 27 Javascript
扫微信小程序码实现网站登陆实现解析
Aug 20 Javascript
基于Vue 撸一个指令实现拖拽功能
Oct 09 Javascript
Vue+Node实现的商城用户管理功能示例
Dec 23 Javascript
TypeScript魔法堂之枚举的超实用手册
Oct 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 if 想到的些问题
2008/03/22 PHP
php入门教程 精简版
2009/12/13 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
js的with语句使用方法
2007/09/21 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
python 不以科学计数法输出的方法
2018/07/16 Python
python中import与from方法总结(推荐)
2019/03/21 Python
解决Mac下使用python的坑
2019/08/13 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
Java里面如何创建一个内部类的实例
2015/01/19 面试题
Ajax的优点和缺点
2014/11/21 面试题
中秋节超市促销方案
2014/01/30 职场文书
求职面试个人自我评价
2014/02/28 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
廉洁家庭事迹材料
2014/05/15 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
乐山大佛导游词
2015/02/02 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android
Vue.Draggable实现交换位置
2022/04/07 Vue.js