IE9 elementUI文件上传的问题解决


Posted in Javascript onOctober 17, 2018

问题: IE9中无法使用FormData

思路

  • 基于上面的问题,需要使用form表单上传文件
  • form表单上传会引起页面的刷新,因此需要动态添加一个iframe来避免页面刷新
  • from表单上传之后需要调用回调,此时需要监听iframe的onload事件

  • 文件上传之后的返回值 Content-Type值不能是application/json 这会导致IE去解析返回结果,最终调用文件的保存或者打开,此处需要与后端协商将Content-Type改为text/plain
  • 如果需要图片回显,回显的图片路径中有有query参数,如果有多个参数会出现&,但是返回结果显示在iframe中所以&会被当做HTML解析为&所以回显之前需要将此处转换回来

问题解决

项目使用VUE编写,UI是ElementUI,但是Element官方明确了upload方面是不支持IE9的,看源码的意思是已经搁置了iframe上传的后续开发

改用vue-upload-component 作者对IE9专门做了兼容,就是使用起来理解成本有点儿高

如何触发上传

通过ref获取upload实例,在添加文件时 激活上传

this.$refs.upload.active = true

如何判断当前上传的状态(添加,更新,删除,上传成功,上传失败)

每次上传的状态变化时 都会调用@input-file绑定的回调,形参是newFile, oldFile,通过新旧文件的对比来得到当前的状态,感觉有点儿反策略模式的意思,自己通过元状态的组合来得到当前状态,习惯的话觉得还是挺有意思的

inputFile(newFile, oldFile) {
 // 旧文件活跃 新文件不活跃 此时上传过程完成
 if (newFile && oldFile && !newFile.active && oldFile.active) {
  this.$refs.upload.active = false
  // 获得相应数据
  let res = '{}'
  // 此处判断相对简单,可以参考jquery.form.js中做的判断
  if (/<pre/.test(newFile.response)) {
   res = />(.*)</.exec(newFile.response)[1]
  }
  res = JSON.parse(res)
  if (res.code !== 200) {
   if (res.code === 402) {
    this.$route.push('/login')
    return
   }
   Message.error(res.message)
  } else {
   Message.success('上传成功')
   // 回显图片
   this.upload.url = res.data.url.replace(/&/g, '&')
  }
  if (newFile.xhr) {
   // 获得响应状态码
   console.log('status', newFile.xhr.status)
  }
 }
 // 添加文件
 if (newFile && !oldFile) {
  this.$refs['upload' + this.index].active = true
 }
}

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

Javascript 相关文章推荐
用JavaScript脚本实现Web页面信息交互
Oct 11 Javascript
jquery 查找新建元素代码
Jul 06 Javascript
B/S模式项目中常用的javascript汇总
Dec 17 Javascript
学习JavaScript鼠标响应事件
Dec 25 Javascript
原生JS实现平滑回到顶部组件
Mar 16 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
May 30 Javascript
Angular Module声明和获取重载实例代码
Sep 14 Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
Feb 28 Javascript
JavaScript数据结构之二叉树的计数算法示例
Apr 13 Javascript
Angular X中使用ngrx的方法详解(附源码)
Jul 10 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
Feb 01 Javascript
vue src动态加载请求获取图片的方法
Oct 17 #Javascript
node实现分片下载的示例代码
Oct 17 #Javascript
在小程序开发中使用npm的方法
Oct 17 #Javascript
浅谈HTTP 缓存的那些事儿
Oct 17 #Javascript
使用angular-cli webpack创建多个包的方法
Oct 16 #Javascript
element-ui的回调函数Events的用法详解
Oct 16 #Javascript
基于vue-upload-component封装一个图片上传组件的示例
Oct 16 #Javascript
You might like
php计算两个日期相差天数的方法
2015/03/14 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
Vue.JS入门教程之事件监听
2016/12/01 Javascript
js实现五星评价功能
2017/03/08 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
python远程登录代码
2008/04/29 Python
python查看列的唯一值方法
2018/07/17 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
softmax及python实现过程解析
2019/09/30 Python
Python属性和内建属性实例解析
2020/01/14 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
用python进行视频剪辑
2020/11/02 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
信息专业个人的自我评价
2013/12/27 职场文书
实习老师离校感言
2014/02/03 职场文书
综合实践活动方案
2014/02/14 职场文书
应届生求职信范文
2014/05/26 职场文书
金融管理专业求职信
2014/07/10 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python