选择相同文件时未触发HTML输入文件选择事件


204

有没有机会检测用户为元素input类型HTML所做的每个文件选择file

之前曾多次问过这个问题,但是onchange如果用户再次选择相同的文件,通常不会建议该事件。


7
如果用户单击“取消”,您的代码是否还必须触发?人们希望单击“取消”不会有任何作用,而且我认为大多数用户还希望重新选择同一文件具有与“取消”相同的效果。我不知道这是否可行,但我还是建议您重新考虑这种设计。
KRyan 2012年

1
取消后,它不应射击或使其无法被检测到。这更意味着删除UI提示:如果在选择文件后调用了某些操作,则用户通常希望再次选择该文件时重复该操作。
dronus 2012年

input在对文件执行某些操作后,如果将s的值设置为“”,则可能会出现这种情况。但这也会删除可见的文件名。但是,这可能没问题,因为实际上已处理文件,并且该操作的结果可能出现在其他位置。
dronus

请解释一下您想做什么?
2012年

1
我想要的只是模拟桌面应用程序具有的老式行为。如果我在桌面应用程序中再次“打开”同一文件,则通常会重新加载该文件,或者如果对该文件执行了某些操作(例如将其转换为其他格式),则将再次执行该操作。这也是桌面用户可能会从Web应用程序中获得的期望,但是file输入onchange事件却并不相似。
dronus 2012年

Answers:


278

的值设置inputnull每个onclick事件。即使选择了相同的路径,这也会重置input的值并触发onchange事件。

input.onclick = function () {
    this.value = null;
};

input.onchange = function () {
    alert(this.value);
};​

这是一个DEMO

注意:如果文件以'C:\ fakepath \'为前缀是正常的。这是一项安全功能,可防止JavaScript知道文件的绝对路径。浏览器仍然内部知道它。


1
我尝试了演示,但是(使用Chrome 21)我不断得到`C:\ fakepath` +然后是我选择的文件名(不包括路径)。但是,对同一文件的每次选择都会显示该警报。
贾斯珀·德弗里斯

1
@JasperdeVries这是一项安全功能,可防止JavaScript知道文件的绝对路径。浏览器仍然内部知道路径。
布赖恩·乌斯塔斯

1
顺便说一句,null是<input type =“ file”>的唯一允许值。因此,如果您尝试将其设置为undefined并获取异常,那么这就是原因。
Noel Abrahams

5
除非您进行以下更改,否则它在IE11中无法正常工作:demo

21
最好放在this.value = null末尾,onchange因为可以在不单击输入元素的情况下激活输入元素(使用键盘)。input.files如果以后需要引用,可以存储。
Halcyon

24
<form enctype='multipart/form-data'>
    <input onchange="alert(this.value); this.value=null; return false;" type='file'>
    <br>
    <input type='submit' value='Upload'>
</form>

this.value=null; 仅适用于Chrome,Firefox可以正常使用 return false;

这里是一个FIDDLE


2
简单有效,仅在最新的IE和chrome中经过测试,就像魅力一样。感谢分享它
阿图尔·乔杜里

8

在本文中,标题为“使用表单输入进行选择”

http://www.html5rocks.com/zh-CN/tutorials/file/dndfiles/

<input type="file" id="files" name="files[]" multiple />

<script>
function handleFileSelect(evt) {

    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
     // Code to execute for every file selected
    }
    // Code to execute after that

}

document.getElementById('files').addEventListener('change', 
                                                  handleFileSelect, 
                                                  false);
</script>

它将事件侦听器添加到“更改”中,但是我对其进行了测试,即使您选择了相同的文件,它也会触发,如果您取消则不会触发。


考虑到这种情况下“更改”可能含糊不清的含义,您是否在多个浏览器中尝试过此操作?您可能希望指定在网络上尝试过的那些浏览器,浏览器在这些方面并不总是完全一致的。
Thor84no 2012年

2
您在什么环境下进行测试?我在Chrome中的经验就是我在问题中提到的经验,该change事件仅在文件名更改时才会触发。
dronus 2012年

7

每次用户单击字段时,使用onClick事件清除目标输入的值。这确保了onChange事件也将针对同一文件触发。为我工作:)

onInputClick = (event) => {
    event.target.value = ''
}

<input type="file" onChange={onFileChanged} onClick={onInputClick} />

使用TypeScript

onInputClick = ( event: React.MouseEvent<HTMLInputElement, MouseEvent>) => {
    const element = event.target as HTMLInputElement
    element.value = ''
}

感谢您的解决方案。
Deepak Tekc​​handani,

1

在文件成功加载后执行任何操作。只需在文件处理完成后将文件控件的值设置为空字符串即可,因此即使文件名更改或不更改,.change()也将始终被调用。例如,你可以做这件事,像魅力一样为我工作

   $('#myFile').change(function () {
       LoadFile("myFile");//function to do processing of file.
       $('#myFile').val('');// set the value to empty of myfile control.
    });

1
handleChange({target}) {
    const files = target.files
    target.value = ''
}

1
嘿ngCourse!纯代码的答案可以解决问题,但是如果您解释它们的解决方法,它们将更加有用。社区需要理论和代码,才能充分理解您的答案。
RBT

尽管这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。来自评论
双响

1

清除输入的第0个索引的值对我有用。请尝试以下代码,希望它可以工作(AngularJs)。

          scope.onClick = function() {
            input[0].value = "";
                input.click();
            };
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.