学习笔记——input:file的美化与文件上传

实例

<input id="upload-btn" type="file" accept="image/png, image/gif" name="file" />

accept属性详解

accept属性主要用于限制文件类型,只有accept属性中声明的文件类型可以被发现。下表中列出了常用的MIME类型(也可以直接在accept属性中申明文件后缀名,如:accept=”.xls, .xlsx”):

后缀名MIME名称
*.3gppaudio/3gpp, video/3gpp
*.ac3audio/ac3
*.asfallpication/vnd.ms-asf
*.auaudio/basic
*.csstext/css
*.csvtext/csv
*.docapplication/msword
*.dotapplication/msword
*.dtdapplication/xml-dtd
*.dwgimage/vnd.dwg
*.dxfimage/vnd.dxf
*.gifimage/gif
*.htmtext/html
*.htmltext/html
*.jp2image/jp2
*.jpeimage/jpeg
*.jpegimage/jpeg
*.jpgimage/jpeg
*.jstext/javascript, application/javascript
*.jsonapplication/json
*.mp2audio/mpeg, video/mpeg
*.mp3audio/mpeg
*.mp4audio/mp4, video/mp4
*.mpegvideo/mpeg
*.mpgvideo/mpeg
*.mppapplication/vnd.ms-project
*.oggapplication/ogg, audio/ogg
*.pdfapplication/pdf
*.pngimage/png
*.potapplication/vnd.ms-powerpoint
*.ppsapplication/vnd.ms-powerpoint
*.pptapplication/vnd.ms-powerpoint
*.rtfapplication/rtf, text/rtf
*.svfimage/vnd.svf
*.tifimage/tiff
*.tiffimage/tiff
*.txttext/plain
*.wdbapplication/vnd.ms-works
*.wpsapplication/vnd.ms-works
*.xhtmlapplication/xhtml+xml
*.xlcapplication/vnd.ms-excel
*.xlmapplication/vnd.ms-excel
*.xlsapplication/vnd.ms-excel
*.xltapplication/vnd.ms-excel
*.xlwapplication/vnd.ms-excel
*.xmltext/xml, application/xml
*.zipaplication/zip
*.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet

美化

原生的input样式显然不能满足我们的要求。那怎样才能自定义按钮样式呢?笔者采用的方法是将input标签包裹在a标签内部,并把input标签的opacity设置为0,通过修改a标签的style来自定义按钮。

css:

#upload-container {
    position: relative;
    // 添加自定义样式
    // TODO
}

#upload {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    opacity: 0;
}

html:

<a id="upload-container" href="javascript:void(0);">上传
    <input id="upload" type="file" accept="image/png, image/gif" name="file" />
</a>

事件

onchange

onchange触发事件必须满足两个条件:
a)当前对象属性改变,并且是由键盘或鼠标事件激发的(脚本触发无效)。
b)当前对象失去焦点(onblur)。

onpropertychange

只要当前对象属性发生改变,都会触发事件,但是它是IE专属的。

oninput

oninput是onpropertychange的非IE浏览器版本,支持firefox和opera等浏览器,但有一点不同,它绑定于对象时,并非该对象所有属性改变都能触发事件,它只在对象value值发生改变时奏效。

总结:经笔者实践
对于chrome来说,onchange可以在文件路径发生改变时触发;
对于opera、firefox等,onchange、oninput可以在选择文件时触发;
对于ie,onpropertychange可以在选择文件时触发;


读取文件

由于新版浏览器出于安全原因并不支持通过input的value属性直接获取文件绝对路径,所以笔者采用以下方法:

document.getElementById("upload").onchange = function(event) {
    var FileReader = window.FileReader;
    var reader = new FileReader();
    reader.onload = function(e) {
        let data = e.target.result;
        console.log(data)
    };

    var file = event.target.files[0];
    reader.readAsDataURL(file);
}
  • onload实现异步加载,将数据加载完毕后,在onload事件中,通过result属性即可获得文件内容。
  • 详细FileReader的API可参见FileReader

尾语

不当之处,敬请斧正,与君共勉。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值