图片上传预览的几种方式,了解下?

图片上传预览场景基本处处可见,朋友圈发动态配图,身份验证及头像更新,莫过如斯。

原由

最近在研究twitter PC网站的时候,在个人中心的主页,设置个人的背景图的时候,发现twitter有个非常好的设计,那就是用户在更改背景墙图片的时候,它根本不是先上传图片,而是在本地预览及编辑图片,待用户点击保存后,才上传图片,可以说是非常省流量的啦。然后,我在玩知乎的时候貌似它是先上传,然后预览的,为啥不学twitter这样做呢?于是乎,我就研究了下图片预览的几种方式,跟大家一起分享下。

介绍几个不常见的BOM对象

URL对象

那么,大家关心的一个问题就是它的兼容性问题了,可以说移动端基本上是没啥问题的啦。除了个别的(IE,你瞅我干啥);
图片上传预览的几种方式,了解下?_第1张图片

FileReader对象

FileReader对象呢,在此不再赘述,因为一谈到图片上传,那必须要用到的。具体可以参看MDN的API文档了FileReader。
这个对象的兼容性,基本上也不用怎么考虑。除非个别的如IE6-9等等。
图片上传预览的几种方式,了解下?_第2张图片

实例演示图片预览的几种方法

经过上述对两个对象的了解,那么大家可能知道,我们预览可能会跟这两个对象有关,毋庸置疑,那是必须要的。


<img id="preview" src="" />
<input type="file" id="select" accept="iamge/png,iamge/jpeg,image/jpg" />
var preview = document.getElementById('preview'),
	select = document.getElementById('select');

select.addEventListener('change', function fileInput (e) {
	if (!this.files.length) return
	var file = this.files[0];
	previewImage(preview, file);
}, false);

  • 第一种,也就是twttier使用的方式:
function previewImage (target, file) {
	try {
		var src = window.URL.createObjectURL(file);
		target.onload = function () {
			window.URL.revokeObjectURL(this.src);
		};
		target.src = src;
	} catch (e) {
		throw new Error('browser doest not support URL')
	}
}
  • 第二种,使用FileReader对象readAsDataURL方法:
function previewImage (target, file) {
	try {
		var fileReader = new FileReader();
		fileReader.onload = function (e) {
			target.src = e.target.result
		};
		fileReader.readAsDataURL(file);
	} catch (e) {
		throw new Error('browser doest not support FileReader')
	}
};
  • 第三种,针对IE的,经了解,在IE7-11下,文件上传地址为本地的绝对路径地址,因此可一直直接将图片路径直接设置为input的值
select.addEventListener('change', function fileInput (e) {
	if (!this.files.length) return
	// 具体要在IE浏览器验证下
	preivew.src = this.value;
}, false);

最后,如果你如果觉得我的文章不错的话,麻烦关注下我的个人公众号【前端汇聚】。
图片上传预览的几种方式,了解下?_第3张图片

你可能感兴趣的:(Javascript)