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 相关文章推荐
一起来写段JS drag拖动代码
Dec 09 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
May 19 Javascript
jquery检测input checked 控件是否被选中的方法
Mar 26 Javascript
AngularJS实现Model缓存的方式
Feb 03 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
Apr 29 Javascript
javascript汉字拼音互转的简单实例
Oct 09 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
JS仿京东移动端手指拨动切换轮播图效果
Apr 10 Javascript
JS实现浏览上传文件的代码
Aug 23 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
Jul 13 Javascript
JavaScript定时器设置、使用与倒计时案例详解
Jul 08 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
PHP4.04简明安装
2006/10/09 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
JS重要知识点小结
2011/11/06 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
@ResponseBody 和 @RequestBody 注解的区别
2017/03/08 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
js中的闭包学习心得
2018/02/06 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
pytorch 常用线性函数详解
2020/01/15 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
财务经理的岗位职责
2013/12/17 职场文书
学校安全工作制度
2014/01/19 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
商务经理岗位职责
2014/07/30 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
初三化学教学反思
2016/02/22 职场文书
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript