php拖拽上传_前端页面文件拖拽上传模块js代码示例

最近给卫生局做一个表格上传/可视化系统,算是小有成果。今天把项目中的文件拖拽上传模块分离出来,做了一个独立的小demo,并把相关代码打包上传到了我的github中,为了其他学习者和开发者提供拙见。

由于代码中我的注释很详尽,所以具体逻辑实现及不介绍了,大家直接看代码及能明白。现在简单列一个功能清单和一些用到的知识点清单:

模态框

文件的批量上传

使用formData API 封装数据 并通过ajax方法提交

读取拖放文件,ondrop事件 dataTransfer对象

清空所有文件

知识点:

单例模式:构建一个单例模式的formData容器

事件冒泡,事件委托:动态添加删除单个文件的方法

css各种布局,BFC

CSS 伪类 link vistied hover active

html 离线操作文档:创建fragment 离线操作,提高性能,减少浏览器的重绘和回流

原型链,原型方法:为formData对象添加一个删除所有文件的方法

CSS伪对象,结合after伪对象画一个‘X'号,放在模态框右上角表示退出按钮

截图:

整体界面

90d1f5e052f0577686e76304707508e0.png

点击‘拖拽上传'按钮

b799ef727cc0d837fd2c70a594d37ca2.png

拖拽文件到虚线框,文件拖入会边框变红提示

0c467178dfd77291a628d15a33c51d88.png

上传成功,弹出提示

563896d4ca6ca5cc46b4cca9872d5065.png

代码:

1. html:

Title

拖拽上传演示模板。点击下方按钮,弹出模态框

点击上传

CSS

.overlay{

z-index: 99;

position:fixed;

display: none;

top:0;

left:0;

width: 100%;

height: 100%;

background-color: #333;

opacity:0.5;

}

.dropbox{

z-index: 100;

display: none;

position: fixed;

width:500px;

height:520px;

margin:auto;

top:0;

right:0;

bottom: 0;

left:0;

background-color: #fff;

border-radius:6px;

transition-duration: 0.9s;

-webkit-transition-duration: 0.9s;

overflow:hidden;

text-align: center;

}

.items-container{

padding: 10px;

}

.content{

border: 3px dashed gray;

border-radius: 10px;

margin: 10px 20px;

height:400px;

overflow: auto;

padding:2px 8px;

}

.head{

margin:0px;

font-size:30px;

color:#aaa;

}

.footer{

margin:5px auto

}

.btn{

border-radius: 20px;

box-sizing: border-box;

border-width: 2px;

background-color: transparent;

font-size: 14px;

font-weight: 500;

padding: 7px 18px

}

/*画一个叉号,表示推出界面*/

.css-close{display:inline-block; width:15px; height:2px; background:#000; font-size:0; line-height:0;vertical-align:middle;-webkit-transform: rotate(45deg);}

.css-close:after { content:'.'; display:block; width:15px; height:2px; background:#000;-webkit-transform: rotate(90deg);}

/*表格样式*/

.table{

width:100%;

border-collapse: collapse;

}

#content tr:first-child td{

border-top-width: 0px;

}

#content tr td:last-child{

cursor: pointer;

color: red;

}

#content tr td{

padding: 8px;

white-space: nowrap;

overflow: hidden;

text-overflow:ellipsis;

border-top:1px solid #9A9A9A;

}

#content tr:hover{

background-color: #d5d5d5;

}

#content tr:active{

background-color: #9A9A9A;

}

a:link{

color:blue;

}

a:visited{

color:blue;

}

a:hover{

color:blue;

}

a:active{

color:red;

}

js代码:

function showModal() { //打开上传框

var modal = document.getElementById('modal');

var overlay = document.getElementsByClassName('overlay')[0];

overlay.style.display = 'block';

modal.style.display = 'block';

}

function closeModal() { //关闭上传框

var modal = document.getElementById('modal');

var overlay = document.getElementsByClassName('overlay')[0];

overlay.style.display = 'none';

modal.style.display = 'none';

}

//用DOM2级方法为右上角的叉号和黑色遮罩层添加事件:点击后关闭上传框

document.getElementsByClassName('overlay')[0].addEventListener('click', closeModal, false);

document.getElementById('close').addEventListener('click', closeModal, false);

//利用html5 FormData() API,创建一个接收文件的对象,因为可以多次拖拽,这里采用单例模式创建对象Dragfiles

var Dragfiles=(function (){

var instance;

return function(){

if(!instance){

instance = new FormData();

}

return instance;

}

}());

//为Dragfiles添加一个清空所有文件的方法

FormData.prototype.deleteAll=function () {

var _this=this;

this.forEach(function(value,key){

_this.delete(key);

})

}

//添加拖拽事件

var dz = document.getElementById('content');

dz.ondragover = function (ev) {

//阻止浏览器默认打开文件的操作

ev.preventDefault();

//拖入文件后边框颜色变红

this.style.borderColor = 'red';

}

dz.ondragleave = function () {

//恢复边框颜色

this.style.borderColor = 'gray';

}

dz.ondrop = function (ev) {

//恢复边框颜色

this.style.borderColor = 'gray';

//阻止浏览器默认打开文件的操作

ev.preventDefault();

var files = ev.dataTransfer.files;

var len=files.length,

i=0;

var frag=document.createDocumentFragment(); //为了减少js修改dom树的频度,先创建一个fragment,然后在fragment里操作

var tr,time,size;

var newForm=Dragfiles(); //获取单例

var it=newForm.entries(); //创建一个迭代器,测试用

while(i

tr=document.createElement('tr');

//获取文件大小

size=Math.round(files[i].size * 100 / 1024) / 100 + 'KB';

//获取格式化的修改时间

time = files[i].lastModifiedDate.toLocaleDateString() + ' '+files[i].lastModifiedDate.toTimeString().split(' ')[0];

tr.innerHTML='

'+files[i].name+''+time+''+size+'删除';

console.log(size+' '+time);

frag.appendChild(tr);

//添加文件到newForm

newForm.append(files[i].name,files[i]);

//console.log(it.next());

i++;

}

this.childNodes[1].childNodes[1].appendChild(frag);

//为什么是‘1'?文档里几乎每一样东西都是一个节点,甚至连空格和换行符都会被解释成节点。而且都包含在childNodes属性所返回的数组中.不同于jade模板

}

function blink()

{

document.getElementById('content').style.borderColor = 'gray';

}

//ajax上传文件

function upload(){

if(document.getElementsByTagName('tbody')[0].hasChildNodes()==false){

document.getElementById('content').style.borderColor = 'red';

setTimeout(blink,200);

return false;

}

var data=Dragfiles(); //获取formData

$.ajax({

url: 'upload',

type: 'POST',

data: data,

async: true,

cache: false,

contentType: false,

processData: false,

success: function (data) {

alert('succeed!') //可以替换为自己的方法

closeModal();

data.deleteAll(); //清空formData

$('.tbody').empty(); //清空列表

},

error: function (returndata) {

alert('failed!') //可以替换为自己的方法

}

});

}

// 用事件委托的方法为‘删除'添加点击事件,使用jquery中的on方法

$(".tbody").on('click','tr td:last-child',function(){

//删除拖拽框已有的文件

var temp=Dragfiles();

var key=$(this).prev().prev().prev().text();

console.log(key);

temp.delete(key);

$(this).parent().remove();

});

//清空所有内容

function clearAll(){

if(document.getElementsByTagName('tbody')[0].hasChildNodes()==false){

document.getElementById('content').style.borderColor = 'red';

setTimeout(blink,300);

return false;

}

var data=Dragfiles();

data.deleteAll(); //清空formData

//$('.tbody').empty(); 等同于以下方法

document.getElementsByTagName('tbody')[0].innerHTML='';

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

weixin_39622217
关注 关注
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
php 文件,File杂谈——异步上实现
weixin_42416398的博客
03-26 291
在前一篇文章《File杂谈——》中我制作了一个静态的界面,文件到显示区域释放,可以显示文件的基本信息。本文将在此基础上进一步加工,打造一个完整的示例示例说明点击区域选择文件或直接将文件入区域,触发文件功能,文件将异步发送到服务器。待服务端处理完成后返回基本信息,在页面中显示。由于服务器容量问题,本示例未做文件保存处理,只是简单的将文件基本信息返回,文件上...
php文件,如何实现文件
weixin_35697229的博客
03-11 383
选择文件屏蔽默认事件刚开始的时候,是在网上找了一个例子,这个例子中提到,需要在document上屏蔽和drag相关的所有事件的默认处理方式,代码如下:$(document).on({dragleave:function(e){ //离e.preventDefault();},drop:function(e){ //后放e.preventDefault();},dragenter:f...
php 图片+视频+音频上(支持预览+
06-26
php 图片+视频+音频上(支持预览+) 包含图片的预览 视频的预看 音频的预听 直接能运行 1将项目放到 www 目录下 2.访问路径 localhost http://localhost/upload/basic-plus.html
html5+php实现文件动上功能
weixin_34313182的博客
10-27 344
界面样式我是参考了一个国外的相册网站,改动不大,只是把鸟语转换成中文,以及上时的样式也进行了改动,之所以选这个的原因就是,我很容易做扩展,它支持3种方式添加图片,一种,一种常规的选择文件,另外的就是添加网络图片。它很巧妙的把三种上模式整合到了一起,而且你可以用IE浏览器浏览下,如果不支持HTML5,是没有图片的提示的,如图:     最重要的就是js部分的代码,...
前端js+php实现图片
而我想……成为一个有趣的妞
05-17 1676
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>图片上</title> </head> <body> <style type="text/css"&
前端页面文件模块js代码示例
10-19
前端页面文件模块js代码示例】是一个实用的前端开发技术,它允许用户通过放操作在网页上上文件。这个技术基于JavaScript,主要用于提升用户体验,简化上流程。下面将详细介绍其中的关键知识点: 1....
JS实现的文件功能示例
10-18
在网页开发中,文件是一种常见的用户交互功能,它提供了便捷的文件方式。本示例主要讲解了如何使用JavaScript实现这一功能,涉及到的核心技术包括事件处理、DOM操作以及FileReader API。 首先,我们...
Java实现文件dropzone.js的简单使用示例代码
10-19
Java 实现文件通常涉及前端与后端两部分的工作。前端部分主要负责用户界面交互,而后端则处理文件的接收、存储以及可能的数据处理。在这个示例中,前端使用了 dropzone.js 库,这是一个轻量级的 JavaScript ...
HTML5 批量上文件示例代码
09-28
HTML5的批量上文件功能是现代网页应用中一项重要的交互设计,它极大地提升了用户在上大量文件时的体验。在本文中,我们将深入探讨如何实现这一特性,特别是使用HTML5、Vue.js和elementUI框架的情况下。 ...
这是一个以php作为后台的 文件客户端 支持批量上
02-09
局域网上文件 支持批量, 环境: php > 5.6 apache/nginx等
html5js和点击上
08-10
file文件的两种方式,点击按钮上文件
Jquery+php fileread html5 批量上图片
04-15
html5 fileread php 批量上图片 有缺陷: 3M以上好像会上失败,有资源分的童鞋,请支持下,
js实现文件并显示待上文件列表
热门推荐
zgjllf1011的博客
02-08 1万+
此文章中完整的代码在我的github中:https://github.com/LiuFeng1011/WebTest/tree/master/upload首先实现html页面的内容:<body> <div name="single" style="text-align: center; "> <A class=btn_addPic href="...
PHP照片
weixin_30456039的博客
06-03 482
HTML页面 <div id="drop_area" style="border: 1px solid red;height: 100px;width: 100px"> <img src="" style="height: 100%;width: 100%"> </div> <button onclick="zphxhrupload('photo'...
Thinkphp文件-使用webuploader插件(自己改动了一些地方)——分片上
hdxyzlh_0225的专栏
11-17 3706
html页面: Thinkphp文件-使用webuploader插件
php 排版代码,实现HTML5示例代码
weixin_39986060的博客
03-29 222
下面小编就为大家带来一篇HTML5的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧相关属性draggable属性是html5的全局属性,是html5支持放操作的方式之一,用来表示元素是否可以被放,draggable有三个值,true表示可以放,false表示不可以被放,auto表示使用浏览器的默认值列表1列表2列表3列表4列表5列表6相关...
thinkphp文件以及 unable to create temporary file in 警告
qq_38320255的博客
09-07 4190
在使用thinkphp进行文件时,可能会报出以下警告。 以上是我使用postman进行上图片的时候报出的异常,而导致图片无法上。 该警告是因为你的php没有开启,或者是临时文件夹权限不够。 解决方法是两步。 1.开启上功能,并设置临时文件夹。此时需要打开php.ini文件。          php.ini文件打开方式有两种:                1.如果使...
thinkphp6 上
weixin_42733582的博客
07-10 243
<?php $file = Request::file('image');//获取表单的上数据 $info = Filesystem::putFile('topic', $file);//目录在 runtime/storage/toppic/时间/文件 //如果想更改上文件的默认配置,在 config/filesystem.php 中配置; 'root' => app()->getRuntimePath() . 'storage', //批量上 <input
[前端] 内容拉伸(效果)
网站前端/PHP/Android/其他
07-02 2548
项目中有时候一个简单的展开容器/折叠容器已经不能适应需求了,这时候要把展开的容器再次拉伸显示更多内容,这样的体验效果更好。。 效果:当我用鼠标动这块区域的时候 ,会显示更多内容,当然这个动肯定要有个上限和下限的设置 因为是项目中的,所以没有单独用测试效果展现,但主要的原理,是把处理后的clientY动态的赋值给容器,鼠标点击的这个点要处理下偏移大小。。。 代码: ...
vue 实现文本的_前端实现文件下载和
最新发布
05-25
关于 Vue 实现文本的,可以使用 Vue 的指令来实现。... 文件 export default { methods: { uploadFile (event) { const files = event.dataTransfer.files // 将文件至服务器 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 黑金fpga_FPGA资料自取 8275
  • 串口485接法图_终于有人把常用的三种通讯方式:RS485、RS232、RS422讲明白了 7878
  • matlab保存所有图,Matlab中图片保存的5种方法 5848
  • xshell左侧导航栏_干货:网站导航,资源搜索,5个收藏很久的资源整合网站 5603
  • vs code 如何在服务器打开文件,本地VSCode编辑远程服务器文件 4502

大家在看

  • 数据结构-十大排序算法集合(四万字精讲集合) 1039

最新文章

  • 微端服务器位置,微端云服务器地址
  • 服务器不能启动故障如何维修,ASTEC AA22600 425W 服务器电源不能启动故障修复(问题解决)...
  • 服务器装系统无法创建新的分区,U盘装系统无法创建新分区解决方法
2021年155篇
2020年197篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源男孩取名带金的起名女孩起名带秋字林姓男孩起名子大全彩虹争霸赛宪字起名长生种港剧网2020牙所起名起名用的好字有哪些项目奇门遁甲演员表用英语 商标 起名美妆店起名大全 时尚陈姓女孩起名男孩起名李诗什么吸血鬼骑士第二季全集www.ccc.36.com临沭二中好寓意的词语起名字海贼王屠魔令批评与自我批评表态发言爆笑qq表情新新魔塔无敌版中央电视台二套直播后厨传奇机械厂起名字有哪些景行行止詹姓男孩起名窃官姓赵的起个名字起个金融公司的名字淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化