解决input[type=file]重复选择文件不触发change事件的方法

作者:竹影

时间:2026-10-30

浏览:198

本文针对HTML5中input[type=file]组件在重复选择相同文件时无法触发change事件的问题,提供了两种实用的解决方案。第一种是通过onblur事件清空input值,利用其优先级高于change的特性强制触发;第二种是在每次选择文件后重建input元素,确保每次操作都是全新的实例,从而保证change事件正常监听。

文章目录

在使用input[type=file]时,如果用户尝试选择与之前完全相同的文件,浏览器通常不会触发change事件。

这是浏览器的内置机制,旨在判断新选文件是否与当前值一致。若一致,则跳过重新加载流程,以避免不必要的性能消耗。

然而,在某些特定业务场景下(例如图片裁剪功能),无论文件是否重复,都需要强制触发change事件以执行后续处理逻辑。

解决方法

可以通过给input元素添加原生onblur事件来清空其value属性,即设置οnblur="this.value=''"。由于blur事件的触发优先级通常高于change事件,这能有效解决重复选择时不触发的问题。

具体实现代码如下:

<input type="file" accept="image/*" οnblur="this.value=''" @change="uploadPhoto" class="uploadImg"/>

解决input file change监听文件(图片)上传事件多次触发

对应的HTML结构代码如下:

<a name="uploadFile" id="uploadFile" href="javascript:;" rel="external nofollow" >[上传文件]</a>
<input id="myFile" name="myFile" value="上传图片" type="file" accept="application/vnd.ms-excel" style="display: none"/>

在开发文件上传功能时,通常需要监听用户的文件选择行为:

    /**
     * 点击上传文件,触发input type="file"
     */
     $("#uploadFile").click(function () {
        const myFile = $("#myFile")
        // 触发
        myFile.click()
        // 监听change事件 
        myFile[0].addEventListener('change', function (e) {
            var filesList = document.querySelector('#myFile').files;
            if(filesList.length==0){ //如果取消上传,则上传文件的长度为0
                console.log("没有上传任何文件");
                return;
            }else{
                //如果有文件上传,这在这里面进行
                console.log(filesList);
            }
        });
    });

但在实际测试中可能会发现,一次文件变更操作却导致了监听函数被多次触发:

在使用input[type=file]时,如果用户尝试选择与之前完全相同的文件,浏览器通常不会触发change事件。

出于安全考虑,浏览器禁止直接对file input的value属性进行赋值,即使尝试将其置空也不被允许。虽然可以通过修改outerHTML的方式清空,但该方案仅在IE浏览器中有效。

由于缺乏标准的置空方法,当用户异步上传完文件后再次选择相同的文件时,因为file input的value(即文件路径)没有发生变化,导致change事件无法被触发。

解决方法是

在每次用户选择完文件后,动态重建该input元素。由于clone节点默认不带值,这相当于创建了一个全新的file input实例,从而确保每一次文件选择都能正常触发change事件。

    /**
     * 点击上传文件,触发input type="file"
     */
    $("#uploadFile").click(function () {
        const myFile = $("#myFile")
        // 触发
        myFile.click()
        // 监听change事件 
        myFile.unbind().change(function (e) {
            console.log(e)
        })
    });

通过这种方式,每次上传不同的文件时都能准确监听到一次改变,符合预期的监听效果:

在使用input[type=file]时,如果用户尝试选择与之前完全相同的文件,浏览器通常不会触发change事件。

总结

以上为个人经验总结,希望能给大家一个参考,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章