首页 > 其他分享 >监听 input type=file 文件上传取消事件

监听 input type=file 文件上传取消事件

时间:2023-04-10 11:14:57浏览次数:40  
标签:文件 取消 type value file input 上传 页面

在做项目的时候,需要根据是否上传图片,(前提是已经上传文件,再次上传取消时,监听取消事件)进而判断页面变化。通过查阅相关资料,发现change事件并不能监听取消,于是从另外一种角度:判断上传的文件是否有值,进而监听取消事件。

代码如下:

<input type="file" name="file" id="fileToUpload" accept="image/*" style="display:none;">

js:

var batchUpload = document.querySelector('#fileToUpload');
     batchUpload.click();
     batchUpload.addEventListener('change', function () {            
          var filesList = document.querySelector('#fileToUpload').files;
          if(filesList.length==0){         //如果取消上传,则改文件的长度为0             
               console.log('取消')
               return;
          }else{  
               //如果有文件上传,这在这里面进行
          }
}); 

但是上面代码存在问题:

1, 如果两次选择打开相同文件,则第二次打开不会执行。

2, 若在页面对话框中选择了取消,无法监听或绑定用户取消动作。(就是第一次上传就选择取消,那么代码也不会执行)

这都是 input files 设计带来的问题,因为 input.value 值未改变, onchange 事件不会被触发。

解决问题:

解决第1个问题的思路,大部分浏览器为了安全限制 input.value 值不可修改,但是可以被置空。因此,onchange 文件打开任务完成后,将缓存 input.value 值置空,第二次打开相同的文件之前 input.value 值是空的,onchange 就会被触发。

document.querySelector(‘input’).value = “”; //有效
document.querySelector(‘input’).value = “data.xls”; //无效

解决第2个问题的思路,文件打开对话框弹出后,当前页面失去焦点,当文件选择对话框关闭(无论是确定还是取消),页面将重新获取焦点。可以绑定页面获取焦点事件,判定用户是否取消了文件选择。
需要注意的是,浏览器页面获取焦点事件早于 onchange 事件约20毫秒,需要页面绑定的事件滞后执行,使用 setTimeout 即可。

代码如下:

var FLAG = 0;

//上传图片并判断条件
$('#upload').click(function () {
  FLAG = 1;
  $("#uploading").text('上传中...')
})

$("#fileToUpload").change(function (e) {
  var fileTypes = [".jpg", ".png"];
      var filePath = fileToUpload.value;
      console.log(filePath)
      if(filePath){
          FLAG = 2;
          ......
          $("#uploading").text('上传成功');
      }
})

// 取消上传
$(window).focus(f => {
    setTimeout(e => {
        if (FLAG == 1) {
            FLAG = 0;
            console.log('取消');
            $("#uploading").text(' ')
        }
    }, 100);
});    

至此,两个问题完美解决。

 

标签:文件,取消,type,value,file,input,上传,页面
From: https://www.cnblogs.com/joe235/p/15874270.html

相关文章

  • Can't get JDBC type for null
    背景Java连接PostGres库,运行SparkSQL脚本报错,原因是:SQL脚本中不能存在null关键字.解决方案将null替换为''即可.......
  • nohup: ignoring input and redirecting stderr to stdout
    把后面的“&”改成“2>&1&”,把启动命令改成如下:nohupjava-jareureka-server.jar>../logs/eureka-server.out2>&1&再次执行,问题解决。解释如下:2>表示把标准错误(stderr)重定向,标准输出(stdout)是1。尖括号后面可以跟文件名,或者是&1,&2,分别表示重定向到标准输出......
  • Content type 'application/json' not supported] (已解决)
    今天在用postman发请求时,以Json的形式发送一个POJO参数,结果一直报错:WARNING]Resolved[org.springframework.web.HttpMediaTypeNotSupportedException:Contenttype'application/json'notsupported],如下图所示:经过检查各方面都没有问题,最发现是在SpringMVC配置类中没有加 ......
  • 编程:利用 FileInputStream 和 FileOutputStream,完成下面的要
    (1)用FileOutputStream往当前目录下“test.txt”文件中写入“HelloWorld”;(2)利用FileInputStream读入test.txt文件,并在控制台上打印出test.txt中的内容。(3)要求用try-catch-finally处理异常,并且关闭流应放在finally块中。代码实现:importjava.io.FileInput......
  • 【Java】FileInputStream和FileOutputStream基本使用
    文章目录InputStream-字节输入流1.FileInputStream介绍2.FileOutputStream介绍3.文件的拷贝IO流-体系图文件VS流InputStream-字节输入流InputStream抽象类是所有类字节输入流的超类InputStream常用的子类FileInputStream:文件输入流BufferedInputStream:缓冲字节输入流O......
  • 【Java】FileReader和FileWrite基本使用
    文章目录1.FileReader和FileWriter是字符流,即按照字符来操作IO2.FileWriter常用方法3.案例演示1.FileReader和FileWriter是字符流,即按照字符来操作IOFileReader相关方法:newFileReader(File/String)read:每次读取单个字符,返回该字符,如果到文件末尾返回-13)read(char[):批量......
  • Nginx的try_files指令详解
    try_files语法:try_filesfile…uri;或 try_filesfile…=code;默认值:无作用域:serverlocation语法解释:官方:Checkstheexistenceoffilesinthespecifiedorderandusesthefirstfoundfileforrequestprocessing;theprocessingisperformedinthecurr......
  • 关于Jmeter中出现Couldn't save test plan to file问题可能造成的原因
    由于最近换了新电脑,使用Jmeter中遇到了保存脚本Couldn'tsavetestplantofile的问题起先尝试了各种方法,如换主题,换jdk版本...都没有解决之前也查看过是否因为权限的问题,但仅查看了脚本文件权限,后续发现需要更改上级目录权限,将只读勾选去除即可。......
  • typeHandler
    一、什么是类型处理器1、类型处理器(TypeHandler)MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成Java类型。也就是java类型与jdbc类型之间的处换器,诸如最常见StringTypeHandler。2、Mybatis内置了......
  • 『0017』 - Solidity Types - Solidity 枚举(Enums)
    作者:黎跃春,案例下面的代码是我对官方案例作了简单的修改而成。ActionChoices就是一个自定义的整型,当枚举数不够多时,它默认的类型为uint8,当枚举数足够多时,它会自动变成uint16,下面的GoLeft==0,GoRight==1,GoStraight==2,SitStill==3。在setGoStraight方法中,我们传入的参数......