原生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 相关文章推荐
ASP中进行HTML数据及JS数据编码函数
Nov 11 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
Dec 15 Javascript
javascript中with()方法的语法格式及使用
Aug 04 Javascript
jquery实现列表上下移动功能
Feb 25 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
基于vuejs+webpack的日期选择插件
May 21 Javascript
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
Mar 01 Javascript
Vue.js 实现数据展示全部和收起功能
Sep 05 Javascript
Node.js 实现远程桌面监控的方法步骤
Jul 02 Javascript
angularjs请求数据的方法示例
Aug 06 Javascript
Vue实现返回顶部按钮实例代码
Oct 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
帖几个PHP的无限分类实现想法~
2007/01/02 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
社区平安建设方案
2014/05/25 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
医药销售自我评价200字
2014/09/11 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
营销计划书范文
2015/01/17 职场文书
长城导游词300字
2015/01/30 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
使用python求解迷宫问题的三种实现方法
2022/03/17 Python