ivew 的ajax,iView-Upload组件分析

源码分析

xhr相关知识点

Ajax要点分析

拖拽事件以及粘贴事件

具体实现

总结

xhr相关知识点

XMLHttpRequest.upload 属性返回一个 XMLHttpRequestUpload对象,用来表示上传的进度。

通过onprogress属性进行监听,是在 XMLHttpRequest 完成之前周期性调用的函数。

xhr.upload.onprogress = function progress(e) {

event.loaded 已传输的数据量

event.total 总共的数据量

if (e.total > 0) {

e.percent = e.loaded / e.total * 100;

}

};

复制代码

XMLHttpRequestEventTarget.onload 是 XMLHttpRequest 请求成功完成时调用的函数。使用该属性使得判断更加简单

使用onreadystatechange属性

xhr.onreadystatechange = function () {

if(xhr.readyState === XMLHttpRequest.DONE) {//当前状态码为'DONE'(4),表示下载操作已完成

console.log(xhr.responseText)

}

}

使用onload属性

xhr.onload = function onload() {

...

};

复制代码

HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。

信息响应(100-199)

成功响应(200-299)

重定向(300-399)

客户端错误(400-499)

服务器错误(500-599)

Ajax的封装

源码链接 github.com/ElemeFE/ele…

该源码不考虑IE低版本的情况,即ActiveXObject不在考虑范围。

创建一个FormData对象,将相关的数据进行添加,包括文件

const formData = new FormData();

if (option.data) {

Object.keys(option.data).map(key => {

formData.append(key, option.data[key]); //通过遍历添加新的属性值

});

}

formData.append(option.filename, option.file); //添加文件

复制代码

状态码status小于200或大于等于300的状态进行错误提示

xhr.onload = function onload() {

if (xhr.status < 200 || xhr.status >= 300) {

return option.onError(getError(action, option, xhr), getBody(xhr));

}

};

复制代码

设置请求头信息,忽略headers的继承属性同时值不能为null;这里进行headers.hasOwnProperty(item)的判断,可以避免这种情况:请求 中的headers继承共用headers中的请求头信息。

const headers = option.headers || {};

for (let item in headers) {

if (headers.hasOwnProperty(item) && headers[item] !== null) {

xhr.setRequestHeader(item, headers[item]);

}

}

复制代码

拖拽事件以及粘贴事件

拖拽事件中,对需要拖动的元素赋予draggable属性;在释放位置所在的元素上使用drop事件,同时在拖动的元素上dragover阻止默认行为以启用drop

document.addEventListener("dragover", function( event ) {

// 阻止默认动作以启用drop

event.preventDefault();

}, false);

复制代码

利用DataTransfer这个对象可以在拖拽过程中传递数据;涉及Upload组件的属性: e.DataTransfer.files在拖动操作中表示文件列表,是一个类数组

dragevent.dataTransfer.setData("text", xxx); //拖动时设置数据

dropevent.dataTransfer.getData("text"); //释放时获取数据

复制代码

粘贴事件paste: 事件处理程序可以通过调用事件的 clipboardData 属性上的 getData()访问剪贴板内容;涉及Upload组件的属性: e.clipboardData.files获取到粘贴的文件列表,同样也是一个类数组

event.clipboardData.getData()

复制代码

具体实现

1d76b474425ce4d805e6c13c05ac1330.png

Upload组件提供了3种选择文件的方式: 点击,拖拽和粘贴;点击的方式通过调用原生的input点击事件,监听input上的change事件获取到文件列表;拖拽和粘贴的方式则是通过事件drop,paste直接获取到文件列表;由于在点击方式中使用的是点击input实现的,所以在单选时弹出文件选择框时已经限制只能选中一个,但是拖拽和粘贴在单选时仍然可以选择多个文件,所以需要进行过滤,保证单选模式下只能存在一个文件。校验文件格式及大小,符合条件就开始发起请求,为每个文件添加属性(uid,percentage,status...),最后,通过回调函数获取上传进度,成功请求,失败请求相关参数。

事件的处理,通过动态触发input元素的click事件,值得注意的是选择完成后,需要手动设置value值为空,保证下次选择同一文件还会触发input的change事件

//点击方式

handleClick () {

...

this.$refs.input.click();

},

handleChange (e) {

const files = e.target.files;

...

this.$refs.input.value = null;

},

//拖拽方式

onDrop (e) {

this.uploadFiles(e.dataTransfer.files);

},

//粘贴方式

handlePaste (e) {

this.uploadFiles(e.clipboardData.files);

}

复制代码

对文件列表初始化

uploadFiles (files) {

let postFiles = Array.prototype.slice.call(files); // 类数组转数组

if (!this.multiple) postFiles = postFiles.slice(0, 1); //单选下保证所有的文件列表只有一条数据

if (postFiles.length === 0) return;

postFiles.forEach(file => {

this.upload(file);

});

},

复制代码

创建每个文件对应的数据集合,并且发起请求,通过值传递为每个数据集合添加uid

post (file) {

this.handleStart(file);

ajax({

...,

onProgress: e => {

this.handleProgress(e, file);

},

onSuccess: res => {

this.handleSuccess(res, file);

},

onError: (err, response) => {

this.handleError(err, response, file);

}

});

}

复制代码

请求回调函数,为对应的处理函数返回值

handleProgress (e, file) {

const _file = this.getFile(file); //获取到文件的详细信息

this.onProgress(e, _file, this.fileList); //事件,当前文件,文件列表

_file.percentage = e.percent || 0; //进度

}

handleSuccess (res, file) {

const _file = this.getFile(file);

if (_file) {

_file.status = 'finished'; //更新状态

_file.response = res;

this.onSuccess(res, _file, this.fileList);

}

},

handleError (err, response, file) {

const _file = this.getFile(file);

const fileList = this.fileList;

_file.status = 'fail'; //更新状态

fileList.splice(fileList.indexOf(_file), 1);

this.onError(err, response, file);

},

复制代码

总结

Upload组件涉及的API较广,需要了解;还有一些概念,比如代码的值传递,基于引用类型的复制,灵活地为每个文件集合添加uid属性,同时又能快捷方便删除项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装thymeleaf 插件_史上最详细的WordPress安装教程(四):安装mysql 5.7

安装mysql添加源rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm#或wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpmrpm -ivh mysql57-community-release-el7-9.noarch.rpm安装yum -y install mysql-community-ser…

域名与网页服务器的什么对应,简述网站从域名到网页的访问流程

简述网站从域名到网页的访问流程时间&#xff1a;2019-12-301384 次浏览大家对上网并不陌生&#xff0c;不管是IT人士还是普通大众&#xff0c;不管用电脑还是手机&#xff0c;上网已变成大家生活中的一部分。什么是上网&#xff1f;简单点讲就是打开网页&#xff0c;说的详细一…

如何修改7 服务器配置,centos7修改服务器配置

centos7修改服务器配置 内容精选换一换简要介绍Oases是一个转录组组装器&#xff0c;旨在没有任何基因组组装的情况下从短读测序技术生成转录本。开发语言&#xff1a;C一句话描述&#xff1a;基因组装软件开源协议&#xff1a;GPL 3.0建议的版本建议使用版本为最新版本&#x…

贴纸效果_(新)AE插件:时尚印刷贴纸效果动画帽子眼镜胡须嘴唇图标社交标题库(3001)...

如何获取 | 点击底部“阅读原文”获取▎ 素材说明Live Stickers库为您提供无限的机会&#xff01;除了动画贴纸外&#xff0c;在项目中&#xff0c;您还将找到许多其他类别。外观类别包括眼睛情感&#xff0c;面具(如Snapchat应用程序中的面具)&#xff0c;凉爽的帽子&#xff…

逆向so_安卓逆向 | 分析调试与so调用实战

声明&#xff1a;本教程用于学习交流&#xff0c;如有侵权联系本人删除&#xff01;点击上方“逆向小白”&#xff0c;选择“加为星标”第一时间关注逆向技术干货&#xff01;使用fiddler抓取某app登录接口的时候&#xff0c;没有看到任何相关的数据包&#xff0c;猜测app做了防…

电容的q值计算公式_在设计电路中电容容量大小、耐压等级选取详解 (转)

原文链接&#xff1a;在设计电路中电容容量大小、耐压等级选取详解 作者:张飞电容的计算 我们对电容的计算&#xff0c;目的是要知道&#xff0c;我们在电路中需要一个多大的电容。为什么要需要这么个电容&#xff1f;它的电压要多高&#xff1f;它的容量要多大&#xff1f;这是…

一个显示器分两个屏幕_桌面改造计划2.0:一个显示器不够那就两个,桌面好物分享...

日常生活节奏快&#xff0c;工作压力大应该目前年轻人的共识。为了适应快节奏的生活&#xff0c;使得大家往往不得不接受996或者997甚至更长的工作时间。而随着更长的工作时间也导致大家在电脑显示器前的时间更长&#xff0c;从而带来更多的不良影响&#xff0c;这两年过劳死的…

python寻找屏幕上的特定字符_库Turtle:用Python指挥小海龟在屏幕上绘图,流行的儿童编程...

海龟绘图&#xff08;Turtle Graphics&#xff09;是向儿童介绍编程的流行方式&#xff0c;源于Wally Feurzig和Seymour Papert1966年开发的LOGO语言。Python内置了Turtle库&#xff0c;基本包含所有原始功能。想象绘图区左上角有一只小海龟&#xff0c;代码就是指挥它动作的命…

flutterapp部分手机无法打开_Flutter run无法在iPhone上打开应用,直接在iphone也无法打开...

在电脑端运行flutter run后&#xff0c;报错信息如下&#xff1a;$ flutter runLaunching lib/main.dart on yuan的 iPhone in debug mode...Automatically signing iOS for device deployment using specified development team in Xcode project: 9D2Q3H854TRunning Xcode bu…

centos7 mysql 安装_CentOS7安装MySQL8.0图文教程(相对最齐全)

登录主机&#xff0c;然后进行下载第一步&#xff1a;在mysql官网下载源文件第二步&#xff1a;Select Operating System: 选择 Red Hat &#xff0c;CentOS 是基于红帽的&#xff0c;Select OS Version: 选择 linux 7第三步&#xff1a;选择 RPM Bundle 点击 Download第四步&a…

cesium等高线_Cesium开源三维地球离线地图发布源码示例功能

一、概述Cesium开源三维地球离线地图发布源码提供了地图切换、查询定位、模型加载、专题图叠加显示和测量功能等&#xff0c;旨在为用户提供一个可以在Cesium快速加载离线地图或在线地图的解决方案&#xff0c;并提供技术支持。除了现有基本功能之外&#xff0c;还可以根据用户…

python 爬取贝壳网小区名称_Python爬虫实战:爬取贝壳网二手房40000条数据

前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于啤酒就辣条 &#xff0c;作者啤酒就辣条一、网页分析爬取贝壳网石家庄二手房信息&#xff0c;先打开链接https://sjz.ke.com/ershoufang…

hive mysql5.7_安装并使用mysql5.7作为hive的metastore

前言hive的metastore默认是使用derby来作为metastore&#xff0c;但是derby有一个缺点是不能支持多用户链接&#xff0c;虽然你可以通过切换目录来支持&#xff0c;但是不同目录的metastore会不一致&#xff0c;所以这里使用mysql来作为hive的metastore。在linux上安装mysql数据…

gitee如何搭建mysql_Windows基于gitee使用hexo搭建个人博客笔记

声明"全局变量"(以后我提到的站点配置文件和主题配置文件地址)&#xff1a;"站点配置文件"位置为 hexo/_config.yml"主题配置文件"位置为 hexo/themes/next/_config.yml搭建hexo安装hexo命令行中输入以下命令(npm即为Node.js环境&#xff0c;如果…

mysql error nr.2003_[MySQL]在安装windows版MySQL时遇到过如下问题Error Nr.1045和Error.Nr.2003,相应解决办法如下...

1、准备mysql server-5.0.27.exe2、按照指导安装&#xff0c;在安装到最后一步时遇到如下两个错误&#xff1a;2.1、出现错误Error Nr.1045解决办法&#xff1a;a).停止MySQL服务&#xff1a;我的电脑-->右键-->管理-->服务和应用程序-->服务 找到名为"MySQL&…

java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题

递归递归需要遵守的重要规则1) 执行一个方法时&#xff0c;就创建一个新的受保护的独立空间(栈空间)2) 方法的局部变量是独立的&#xff0c;不会相互影响, 比如 n 变量3) 如果方法中使用的是引用类型变量(比如数组)&#xff0c;就会共享该引用类型的数据.4) 递归 必须向退出递归…

cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?

原标题&#xff1a;并发环境下&#xff0c;先操作数据库还是先操作缓存&#xff1f;来源&#xff1a;捡田螺的小男孩前言在分布式系统中&#xff0c;缓存和数据库同时存在时&#xff0c;如果有写操作&#xff0c;先操作数据库还是先操作缓存呢&#xff1f;本文将分5种方案 展开…

java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器

一、方法一打印虚拟机所有参数[rootlocalhost ~]# java -XX:PrintFlagsFinal -version | grep :uintx InitialHeapSize : 258689024 {product}uintx MaxHeapSize : 4139778048 {product}bool PrintFlagsFinal : true {product}bool UseCompressedOops : true {lp64_product}boo…

java在W n8安装_在windows中安装JDK8并配置环境变量-java环境变量设置

学习JAVA&#xff0c;必须得安装一下JDK(Java development kit java开发工具包)&#xff0c;配置一下环境就可以学习JAVA了&#xff0c;下面是下载和安装JDK的教程&#xff1a;一、去oracle官网上下载jdk8的下载地址&#xff1a;https://www.oracle.com/technetwork/java/javas…

java将图片上传数据库_〔技巧实例〕轻松实现将上传图片到数据库

很久就想自己写一写程序了&#xff0c;不过由于赖就不想写我&#xff0c;今天刚好有空&#xff0c;所以写了这个小小的程序很容易一看就知道的&#xff0c;不多说了就此开始&#xff1a;我们做一个上传的。数据据库的字段就id自动编号 big 字段类型是 OLE 呵呵就简单的那个字段…