zoukankan      html  css  js  c++  java
  • 原生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事件
          }
        }
     
  • 相关阅读:
    【持续更新】Java知识点整理-util
    【持续更新】Java知识点整理-基础
    【持续更新】Java知识点整理-JVM
    notepad++中写markdown
    VirtualBox中Alpine Linux + Docker安装记录
    Alpine Linux配置网络
    从编码的历史了解编码
    关于摄影器材的一些知识点
    服务器(Linux)上运行python总结
    命令行运行Python脚本时传入参数的三种方式
  • 原文地址:https://www.cnblogs.com/chip-gan/p/11258908.html
Copyright © 2011-2022 走看看