选择同一文件时不会触发HTML输入文件选择事件

时间:2012-08-19 23:06:26

标签: javascript html forms javascript-events

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

之前曾多次询问此问题,但如果用户再次选择同一文件,则通常会提出onchange事件。

9 个答案:

答案 0 :(得分:225)

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

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

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

这是DEMO

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

答案 1 :(得分:17)

<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 :(得分:7)

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

http://www.html5rocks.com/en/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>

它为“更改”添加了一个事件监听器,但我测试了它,即使您选择了相同的文件也会触发它,如果您取消则不会触发。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

          scope.onClick = function() {
            input[0].value = "";
                input.click();
            };

答案 6 :(得分:0)

每次用户单击字段时,使用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 = ''
}

答案 7 :(得分:0)

如果您使用的是 Angular,则使用双向绑定对我有用。

这是我的 HMTL

<input type="file" #upload name="upload" [(ngModel)]="inputValue"(change)='fileEvent($event)'/>

和 TS..

  @ViewChild('upload') uploadBtn: HTMLElement;

  fileEvent(e: any){
    
   //file upload part... 

    this.inputValue = "";
  }

答案 8 :(得分:0)

<input #myInput type="file" id="imgFile" (click)="$event.target.value=null"
       (change)="detectUploadedImage($event)" accept="image/*" />