原生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 相关文章推荐
初步使用bootstrap快速创建页面
Mar 03 Javascript
jQuery实现查找链接文字替换属性的方法
Jun 27 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 Javascript
JavaScript对象引用与赋值实例详解
Mar 15 Javascript
详谈javascript精度问题与调整
Jul 08 Javascript
JS实现评价的星星功能
Aug 20 Javascript
Vue2.0父子组件传递函数的教程详解
Oct 16 Javascript
详解Vue项目部署遇到的问题及解决方案
Jan 11 Javascript
webpack结合express实现自动刷新的方法
May 07 Javascript
初试vue-cli使用HBuilderx打包app的坑
Jul 17 Javascript
js定义类的方法示例【ES5与ES6】
Jul 30 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
最常用的8款PHP调试工具
2014/07/06 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
php生成图片验证码
2015/06/09 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
python绘制直线的方法
2018/06/30 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
单位消防安全制度
2014/01/12 职场文书
预防传染病方案
2014/06/14 职场文书
班级心理活动总结
2014/07/04 职场文书
国企干部对照检查材料
2014/08/22 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
中秋节晚会开场白
2015/05/29 职场文书
教师节班会主持词
2015/07/06 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
新手初学Java网络编程
2021/07/07 Java/Android