我想在用户选择文件时触发一个事件。如果用户每次更改文件,则使用.change
事件即可运行。
但是,如果用户再次选择相同的文件,我想要触发该事件。
- 用户选择文件
A.jpg
(事件触发) - 用户选择文件
B.jpg
(事件触发) - 用户选择文件
B.jpg
(事件不会触发,我希望它触发)
我该怎么做?
我想在用户选择文件时触发一个事件。如果用户每次更改文件,则使用.change
事件即可运行。
但是,如果用户再次选择相同的文件,我想要触发该事件。
A.jpg
(事件触发)B.jpg
(事件触发)B.jpg
(事件不会触发,我希望它触发)我该怎么做?
每次用户单击控件时,您可以简单地将文件路径设置为null。现在,即使用户选择相同的文件,也会触发onchange事件。
<input id="file" onchange="file_changed(this)" onclick="this.value=null;" type="file" accept="*/*" />
你可以骗过它。移除文件元素并在change
事件中再次添加它。这将清除文件路径,使其每次都可以更改。
或者你可以简单地使用.prop("value", "")
,参见jsFiddle上的此示例。
prop
attr
.attr("value", "")
或.val("")
(如下所建议的@wagner-leonardi)时,Internet Explorer会触发change事件,而Chrome不会。 - fadomire.prop("value", "")
来设置。 - Roger Barreto如果你尝试了.attr("value", "")
但是没有起作用,不要惊慌(就像我一样)
只需使用.val("")
代替,就可以正常工作了
使用 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 = ''
}
我找到了一种React-y的解决方案,对我很有效:
onClick={event => event.target.value = null}
我通过在点击时清除文件输入的值,然后在更改时发布文件来使其工作。这允许用户连续两次选择同一文件,并仍然触发更改事件以将其发布到服务器。我的示例使用jQuery表单插件。
$('input[type=file]').click(function(){
$(this).attr("value", "");
})
$('input[type=file]').change(function(){
$('#my-form').ajaxSubmit(options);
})
onClick
在 onChange
之前触发,所以这个方法对我非常有效。 - iplus26$(this).val("");
。 - JohnKVueJs 解决方案
<input
type="file"
style="display: none;"
ref="fileInput"
accept="*"
@change="onFilePicked"
@click="$refs.fileInput.value=null"
>
这对我有效
<input type="file" onchange="function();this.value=null;return false;">
最简单的方法是将值设置为空字符串。这会强制它每次都“更改”文件,即使选择的仍然是同一个文件。
<input type="file" value="" />
受 @braitsch 的启发,我在我的 AngularJS2 input-file-component
中使用了以下代码:
<input id="file" onclick="onClick($event) onchange="onChange($event)" type="file" accept="*/*" />
export class InputFile {
@Input()
file:File|Blob;
@Output()
fileChange = new EventEmitter();
onClick(event) {
event.target.value=''
}
onChange(e){
let files = e.target.files;
if(files.length){
this.file = files[0];
}
else { this.file = null}
this.fileChange.emit(this.file);
}
}
Here the onClick(event)
rescued me :-)