vue.js 实现图片本地预览 裁剪 压缩 上传功能


Posted in Javascript onMarch 01, 2018

以下代码涉及 Vue 2.0 及 ES6 语法。

目标

纯 javascrpit 实现,兼容ie9及以上浏览器,在本地做好文件格式、长宽、大小的检测,减少浏览器交互。

现实是残酷的,为了兼容Ie9 还是用上了 flash,第二篇来解释解释。

代码结构

<div id="wrap">
 <label>
  点我上传图片
  <input type='file' @change="change" ref="input">
 </label>
 <img :src="src" ref="img">
</div>
new Vue({
 el: '#wrap',
 data: {
  // 一张透明的图片
  src:'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', 
  elInput: null
 },
 methods: {
  change(e){
   // ...
  }
 }
})

如何获取图片大小

现代浏览器中十分简单

function getSize(e){
 return e.target.files[0].size;
}

但 ie9 下暂时没有找到纯 JS 的方案。

因此,在需要判断大小时,遇到 ie9 直接绕过不去判断

如何预览本地图片

const refs = this.$refs
const elInput = refs.input
const elImg = refs.img

现代浏览器中,通过调用 FileReader 读取本地图片,将图片地址转成 Base64 格式实现预览。

function getSrc(){
 const reader = new FileReader();
 reader.onload = (e) => {
  const src = e.target.result;
  elImg.src = src;
 };
 if (elInput.files && elInput.files[0]) {
  reader.readAsDataURL(elInput.files[0]);
 }
}

但是问题又来了,ie9 并不支持 FileReader,但可以通过 ie 滤镜显示。

function getSrc(){
 elInput.select();
 elInput.blur();
 const src = document.selection.createRange().text;
 document.selection.empty();
 elImg.style.filter = `progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='${src}')`;
}

滤镜中 sizingMethod='scale' 的写法是为了图片能适应内容缩放。

由于 IE9 对安全限制有所增强,实践中会遇到以下两个问题:

如果 file 控件获得焦点,则 document.selection.createRange() 拒绝访问,因此需要在 elInput.select() 后面加一句 elInput.blur() 即可。

为了让上传按钮更美观,默认给 input[type=file] 的设置了样式 visible:hidden ,这样会导致 ie9 下报错。应该会被浏览器认为欺骗用户点击,只好曲线救国。

label{
 overflow:hidden;
}
label input[type='file']{
 position:absolute;
 top:9999px;
 left:9999px;
}

如何获取图片长宽

同理,利用 ie 滤镜和 FileReader 的方案对 ie9 和非 ie9 分别实现。

ie9 的方案

参数 src 接受的是本地图片路径

let tempEl;
const getSizeIncompatible = (src, callback) => {
 if (!tempEl) {
  tempEl = document.createElement('div');
  tempEl.style.position = 'absolute';
  tempEl.style.width = '1px';
  tempEl.style.height = '1px';
  tempEl.style.left = '-9999px';
  tempEl.style.top = '-9999px';
  tempEl.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image)';
  document.body.insertBefore(tempEl, document.body.firstChild);
 }
 tempEl.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = src;
 callback(tempEl.offsetWidth, tempEl.offsetHeight);
};

其中 sizingMethod='image' 是为了图片显示原始大小。

非 ie9 方案

参数 src 接受的是 base64 编码后的图片路径

const getSize = (src, callback) => {
 const image = new Image();
 image.onload = () => {
  callback(image.width, image.height);
 };
 image.src = src;
};

参考

https://elemefe.github.io/ima...

总结

以上所述是小编给大家介绍的vue.js 实现图片本地预览 裁剪 压缩 上传功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jquery的$.ajax async使用
Oct 19 Javascript
js setTimeout opener的用法示例详解
Oct 23 Javascript
Javascript中设置默认参数值示例
Sep 11 Javascript
jQuery判断元素上是否绑定了指定事件的方法
Mar 17 Javascript
简单介绍jsonp 使用小结
Jan 27 Javascript
详解AngularJS验证、过滤器、指令
Jan 04 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
详解vue父子组件间传值(props)
Jun 29 Javascript
使用DataTable插件实现异步加载数据
Nov 19 Javascript
JS html事件冒泡和事件捕获操作示例
May 01 Javascript
js针对图片加载失败的处理方法分析
Aug 24 Javascript
Vue双向数据绑定(MVVM)的原理
Oct 03 Javascript
vue中使用cropperjs的方法
Mar 01 #Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
Mar 01 #Javascript
Vuex中mutations与actions的区别详解
Mar 01 #Javascript
vue 实现剪裁图片并上传服务器功能
Mar 01 #Javascript
解决easyui日期时间框ie的兼容的问题
Mar 01 #Javascript
详解Immutable及 React 中实践
Mar 01 #Javascript
解决VUEX兼容IE上的报错问题
Mar 01 #Javascript
You might like
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php实现计数器方法小结
2015/01/05 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
AUC计算方法与Python实现代码
2020/02/28 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
成功的酒店创业计划书
2013/12/27 职场文书
培训师岗位职责
2015/02/14 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
Python初识逻辑与if语句及用法大全
2021/08/07 Python
postgresql中如何执行sql文件
2023/05/08 PostgreSQL