当前位置: 首页 > news >正文

[JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]

场景

  1. 不可否认,使用JQuery来提交表单文件还是比较方便的。问题是JQuery性能问题,去掉JQuery如何提交文件,并且监听文件的提交进度?

说明

  1. 提交表单文件<form enctype="multipart/form-data"...需要增加enctype="multipart/form-data"的属性,不然无法提交成功。

  2. 使用原生XMLHttpRequest技术提交文件时, 是不需要设置Content-Type[5]的。

  3. 对上传文件进行进度监听,是需要监听XMLHttpRequest的属性uploadprogress[1]事件的。ProgressEvent的两个关键值loaded表示底层已经处理的字节数,单位是64位无符号整型,另一个total表示底层需要处理的总字节数。

r.upload.addEventListener('progress', function (e) {
      var progressRateInt = parseInt(e.loaded * 100 / e.total);
      var progress = document.getElementById("myProgress");
      progress.value = progressRateInt;
      var percent = document.getElementById("percent");
      percent.innerHTML = progressRateInt+"%";
});
  1. 发送文件表单里的其他输入框数据,不再需要把FormData的值提取出来组合成key1=value1&key2=value2...的形式。可直接发送。
const oData = new FormData(form);
r.send(oData);

例子

function asyncSubmit(form,action){

    const oData = new FormData(form);
    var progress = document.getElementById("myProgress");
    progress.value = 0;

    var r = new XMLHttpRequest();
    r.open("POST", action,true);
    r.onreadystatechange = function () {
        if (r.readyState != 4 || r.status != 200) return;

        var data = JSON.parse(r.responseText);
        if(data.status == 1){

            if(data.message.length > 0){
                var imgPath = JSON.parse(data.message);
                if(imgPath.bannerImg){
                    var bannerImg = document.getElementById("bannerImg");
                    bannerImg.value = imgPath.bannerImg;

                    var imgUrl = document.getElementById("img_url");
                    imgUrl.href = "/upload/"+imgPath.bannerImg;
                }
            }
        }else{
            alert("Submit error.");
        }
    };

    r.upload.addEventListener('progress', function (e) {
          var progressRateInt = parseInt(e.loaded * 100 / e.total);
          var progress = document.getElementById("myProgress");
          progress.value = progressRateInt;
          var percent = document.getElementById("percent");
          percent.innerHTML = progressRateInt+"%";
    });

    r.send(oData);
}

参考

  1. 进度条 ProgressEvent - Web APIs | MDN

  2. XMLHttpRequest - Web APIs | MDN

  3. Sending form data - Learn web development | MDN

  4. JavaScript HTML DOM EventListener

  5. 不使用JQuery如何提交Ajax的表单请求

相关文章:

  • 笔记整体梳理
  • 【题解】同济线代习题一.6.3
  • MATLAB算法实战应用案例精讲-【智能优化算法】黑寡妇算法-BWO(附matlab代码)
  • 云原生之容器编排实践-minikube传递秘钥使用阿里云私有镜像仓库
  • 【React Scheduler源码第一篇】哪些API适合用于任务调度
  • 【笔记:模拟MOS集成电路】偏置电路(基本原理+结构分析)
  • 【第六章 final、abstract】
  • 【JavaEE初阶】文件操作 和 IO (上篇)
  • Spring教程-01-IOC控制反转
  • Spring Cloud Gateway过滤器配置
  • Tomcat服务
  • REDIS05_SpringBoot整合redis、RedisTemplate操作各个基本类型、工具类的抽取
  • Sentinel的安装与配置
  • 生命周期函数
  • Go语言学习笔记——正则表达式
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Java 网络编程(2):UDP 的使用
  • Mithril.js 入门介绍
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • PHP面试之三:MySQL数据库
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Terraform入门 - 1. 安装Terraform
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • windows下使用nginx调试简介
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 警报:线上事故之CountDownLatch的威力
  • 聚类分析——Kmeans
  • 小而合理的前端理论:rscss和rsjs
  • 写代码的正确姿势
  • 写给高年级小学生看的《Bash 指南》
  • 异常机制详解
  • 再谈express与koa的对比
  • 中文输入法与React文本输入框的问题与解决方案
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (14)Hive调优——合并小文件
  • .chm格式文件如何阅读
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Mobi域名介绍
  • .net CHARTING图表控件下载地址
  • .NET Core 2.1路线图
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 药厂业务系统 CPU爆高分析
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • []串口通信 零星笔记
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [bbk5179]第66集 第7章 - 数据库的维护 03