原生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 相关文章推荐
很多人都是用下面的js刷新站IP和PV
Sep 05 Javascript
JQuery 应用 JQuery.groupTable.js
Dec 15 Javascript
jQuery Tools tab使用介绍
Jul 14 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
Sep 02 Javascript
jquery选择checked在ie8普通模式下的问题
Feb 12 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
Aug 29 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
angular ng-model 无法获取值的处理方法
Oct 02 Javascript
vue-cli3.0 环境变量与模式配置方法
Nov 08 Javascript
javascript实现贪吃蛇经典游戏
Apr 10 Javascript
原生js实现轮播图特效
May 04 Javascript
JavaScript中ES6规范中let和const的用法和区别
Aug 06 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代码
2006/12/06 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
python实现解数独程序代码
2017/04/12 Python
python变量命名的7条建议
2019/07/04 Python
python实现的自动发送消息功能详解
2019/08/15 Python
Python os模块常用方法和属性总结
2020/02/20 Python
python 的topk算法实例
2020/04/02 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
报关员个人职业生涯规划书
2014/03/12 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
学生检讨书如何写
2014/10/30 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
活动总结模板大全
2015/05/11 职场文书
小学英语教学反思范文
2016/02/15 职场文书