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;说的详细一…

通过思科构造局域网_cisco设备构建典型局域网

典型局域网----三层交换机VLAN间路由和DHCP配置综合实验作者&#xff1a;Jason_Chenxz日期&#xff1a;2009.8.21内容&#xff1a;在一个典型局域网中实现三层交换机VTP、VLAN创建、VLAN间路由、上联设置以及DHCP服务&#xff0c;为各个VLAN分配IP地址、保留部分地址用于手动分…

分布式系统主从服务器,基于主从服务器的分布式存储系统的设计与实现

摘要&#xff1a;随着计算机网络,特别是Internet的迅猛发展,传统的信息系统概念发生了巨大的变化,基于网络的分布式信息系统在各个领域得到了广泛的应用,在整个社会生活中正发挥着日益突出的作用。Internet已经越来越多地成为构建信息系统的一个关键组成部分。如何在更为广域和…

中山大学曾兆阳_2010—2011学年度中山大学信科院优秀学生奖学金评选结果名单...

院系&#xff1a;信息科学与技术学院一等奖&#xff1a;获奖人数&#xff1a;沈招益姚良超张华张艺腾张起彤马楠熠刘宇熙陈水明赵钦耀张永福程嘉朗赖沛骏陈锦浩林舟驰林庆忠张嘉方晓敏符昊明薛政陈铮涛邓子恒刘冶马俊铖黄哲刘宸亨黄奕丰何浩汪翔郑东学章小强黄晓月二等奖&#…

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

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

常用英雄胜率怎么刷_单排刷英雄胜率或者炸鱼方法。

适用对象&#xff1a;想刷英雄胜率又找不到车队一起刷的&#xff0c;亦或者单纯想炸鱼娱乐一下。适用英雄&#xff1a;有神装二打五终结比赛能力的射手&#xff0c;打野以及部分战士英雄&#xff0c;并且个人水准能使用以上英雄打上王者。准备工具&#xff1a;两个微信or qq号&…

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

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

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

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

ide打开项目运行和调试按钮都是灰色的_如何开发一个IDE

IDE对于语言来说非常重要&#xff0c;让新手能更快入门&#xff0c;让老手能有更高的开发效率。所以我摸索着开发了Fanx语言的IDE。这里分享一些IDE内部工作原理和经验。IDE和编译器IDE为了实现功能&#xff0c;需要对源码进行解析。经过词法分析、语法分析、语义分析。相当于编…

电容的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…

mysql定时导入_MySQL导入、导出、数据库定时备份

本篇使用的MySQL版本是5.7.30&#xff0c;注意不同版本之间可能会有差异。一、导出操作1、查找mysqldump命令位置which mysqldump2、mysqldump导出示例用户名和密码分别是root和123456&#xff1b;导出远程库&#xff0c;使用-hIP和-port端口&#xff0c;如下所示。后面的命令默…

ubuntu mysql 初始化_Ubuntu初始化MySQL碰到的坑

想着将MySQL初始化&#xff0c;改变一下存放数据文件的位置&#xff1a;rootubuntu:/lvmdata# mkdir datarootubuntu:/lvmdata# chown -R mysql:mysql /lvmdata/data修改MySQL配置文件&#xff1a;datadir /lvmdata/data然后初始化&#xff1a;rootubuntu:/lvmdata# mysqld --…

mysql 攻击密码_MySQL用户Root密码为弱口令的攻击

1、连接到对方MYSQL 服务器mysql -u root -h 192.168.0.1mysql.exe 这个程序在你安装了MYSQL的的BIN目录中。2、让我们来看看服务器中有些什么数据库mysqlshow databases; MYSQL默认安装时会有MYSQL、TEST这两个数据库&#xff0c;如果你看到有其它的数据库那么就是用户自建的数…

mysql封装执行_解决Mysql封装类执行报错——Mysql::insert() should not be called

今天在写程序的时候使用了别的程序员写的一个Mysql封装类&#xff0c;但是执行后php会报错&#xff1a;Strict standards: Non-static method Mysql::insert() should not be called statically in关于这个错误的的处理方法是修改类文件&#xff0c;将对应报错的“function ins…

mysql建立从库同时备份_mysql主从库配置读写分离以及备份

1&#xff0c;什么是读写分离&#xff1f;其实就是将数据库分为了主从库&#xff0c;一个主库用于写数据&#xff0c;多个从库完成读数据的操作&#xff0c;主从库之间通过某种机制进行数据的同步&#xff0c;是一种常见的数据库架构。一个组从同步集群&#xff0c;通常被称为是…