javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > input[type=file]选择重复的文件,无法触发change事件

js之input[type=file]选择重复的文件,无法触发change事件问题

作者:草字

这篇文章主要介绍了js之input[type=file]选择重复的文件,无法触发change事件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

input[type=file]选择重复的文件,无法触发change事件

选择文件的时候,浏览器会判断是否跟之前一致,如果一致他就不会重新加载这个文件,避免无谓的加载消耗。

所以我们在不一样的需求的时候,比如裁剪图片,无论他是不是相同图片,都必须让他触发change事件,这样才能进行下一步处理。

解决方法

给input添加原生事件onblur进行清空,ο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);
            }
        });
    });

但是结果一次改变,却触发多次监听:

由于file input出于安全角度,是不允许赋值的,即使是置空,虽然通过给outerHtml赋值可以清空,但仅在ie下起使用。

因为缺少置空的方法,用户异步上传完毕文件后选择相同文件时,不会触发change,因为在这种情况下,我们没有办法使value(也就是文件路径)发生变化。

解决方法是

每次选完文件,就重建此元素,这样值自然是空的,因为clone不带值,这样就是一个全新的file input,每一次选择,自然各种正常。

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

这样每上传一次不同的文件就可以监听到一次改变,符合监听的效果:

总结

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

您可能感兴趣的文章:
阅读全文