原生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 实现Tab效果 思路是js思路
Mar 02 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
Oct 20 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 Javascript
js 页面关闭前的出现提示的实现代码
May 25 Javascript
JavaScript获取当前网页最后修改时间的方法
Apr 03 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
js生成验证码并直接在前端判断
May 15 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
vue-cli如何快速构建vue项目
Apr 26 Javascript
JavaScript实现获取select下拉框中第一个值的方法
Feb 06 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
Apr 13 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
Jun 01 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初学者们头痛的十四个问题
2007/01/15 PHP
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
php eval函数用法总结
2012/10/31 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
python计算圆周率pi的方法
2015/07/11 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
python 编写简单网页服务器的实例
2018/06/01 Python
Python模块的加载讲解
2019/01/15 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
公证书样本
2014/04/10 职场文书
自我推荐信范文
2014/05/09 职场文书
禁毒宣传标语
2014/06/19 职场文书
感恩教育主题班会
2015/08/12 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
学习心得体会
2019/06/20 职场文书