原生JS上传文件夹,阻止浏览器默认弹窗(上传文件夹的弹窗)

最近在工作中遇到一个上传文档的需求,用elementUI组件没有上传文件夹功能,只有上传文档功能,在开发过程中遇到如下几个问题,在此总结一下。

1、input框支持上传文件夹,必须要在input标签添加webkitdirectory属性。(上传文件夹功能不是所有浏览器都支持)

<input type="file" webkitdirectory />

2、项目需求:第一次点击长传文件夹长传成功之后,第二次点击给出提示框,只能长传一次。在这里我一开始的思路是input触发的onchange事件,去onchange事件监听阻止掉默认行为,后来才发现点击input框之后,给的上传文件夹弹窗是在click事件的时候触发的,所以想要阻止掉浏览器弹窗,就在input标签上绑定一个click事件,在click事件中阻止浏览器默认行为,弹窗就不会出现。以下代码是以vue框架为基础写的。

1)在input标签绑定一个click事件

<input type="file" webkitdirectory @click="fileUploadCheck">

2)在methods里面给这个方法做出相应的校验,满足需求阻止浏览器默认行为

fileUploadCheck(){
     // .....根据项目需求做校验,满足条件阻止浏览器默认行为
     if(e&&e.preventDefault) {
       e.preventDefault();
     }

   }

3、如果想要阻止elementUI的上传文档组件的弹窗,我们还得通过JS获取到input元素,给他添加一个click事件。在这里我遇到一个问题是,通过原生JS给元素绑定事件,在if判断里不能移除此次事件,上传文档的弹窗被阻止之后,就一致被阻止掉。我想要条件允许时,给这个弹窗又可以出现。最终我给他添加绑定事件的时候,下一句代码就移除这个事件。

 fileUploadCheck(){
      let inputFile = document.getElementById('inputfile') //获取到input框
      let hanle = function(event){  //阻止浏览器默认事件
        if(event.preventDefault && event){
          event.preventDefault()
        }
      }
      if(!this.flag){ //此变量是判断是否已经上传文件
        inputFile.addEventListener('click',hanle,false)  //满足条件给input绑定事件
        this.$message('文档和文件夹只能上传一次')
        setTimeout(function(){
          inputFile.removeEventListener('click',hanle,false)  //移除事件
        },500)
      }else {
        //如果将 inputFile.removeEventListener('click',hanle,false)写在else,不能移除hanle事件
      }
    }

 

 

 
posted @ 2019-07-28 14:36  翻脸不如翻身  阅读(4562)  评论(0编辑  收藏  举报