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

dro*_*nus 181 html javascript forms dom-events

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

之前曾多次询问此问题,但onchange如果用户再次选择同一文件,则通常建议的事件不会触发.

Bri*_*tas 244

在每个事件上设置inputto 的值.即使选择了相同的路径,这也会重置该值并触发事件.nullonclickinputonchange

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

input.onchange = function () {
    alert(this.value);
};?
Run Code Online (Sandbox Code Playgroud)

这是一个演示.

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

  • 最好将`this.value = null`放在`onchange`的末尾,因为可以激活输入元素而不点击它(使用键盘).如果以后需要引用它,可以存储`input.files`. (15认同)
  • 除非你做了一些小改动,否则它在IE11中效果不佳:[demo](http://jsfiddle.net/scMF6/2/). (4认同)
  • 我尝试了演示,但是(使用 Chrome 21)我不断收到 `C:\fakepath\` + 然后是我选择的文件名(不包括路径)。不过,该警报会在每次选择同一文件时显示。 (2认同)

Tra*_*Law 26

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

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

<input type="file" onChange={onFileChanged} onClick={onInputClick} />
Run Code Online (Sandbox Code Playgroud)

使用打字稿

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


els*_*hll 21

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

this.value=null; 只有Chrome才有必要,Firefox才能正常使用 return false;

这是一个FIDDLE

  • 简单有效,刚刚在最新的IE和Chrome中测试过,就像魅力一样.谢谢你的分享 (2认同)

小智 8

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

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>
Run Code Online (Sandbox Code Playgroud)

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

  • 您用于测试的环境是什么?我对Chrome的体验是我在问题中提到的那个,`change`事件只会在文件名更改时触发. (2认同)

Sha*_*pta 6

handleChange({target}) {
    const files = target.files
    target.value = ''
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿当然!仅代码答案可能会解决问题,但如果您解释它们如何解决问题,它们会更有用。社区需要理论和代码才能充分理解您的答案。 (2认同)