如何重置<输入类型=“文件”>


400

我正在使用VS2012和Javascript开发Metro应用程序

我想重置文件输入的内容:

<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />

我应该怎么做?


1
内容是什么意思?
Maess 2013年

3
您的意思是说,用户选择文件后,您想将所选文件重设为“无”吗?
ddavison


14
似乎是一个简单inputElement.value = ""的伎俩就好了,而不作为建议诉诸克隆或包裹。在CH(46),IE(11)和FF(41)中工作
Robert Koritnik

Answers:


371

@ dhaval-marthak在评论中发布的jQuery解决方案显然有效,但是如果您查看实际的jQuery调用,则很容易看到jQuery在做什么,只需将value属性设置为空字符串即可。因此,在“纯” JavaScript中,它将是:

document.getElementById("uploadCaptureInputFile").value = "";

15
谢谢!如果您已经有了jquery引用,则$ input.val(“”)将照常工作。
Natan 2014年

@ 2ndGAB嗯...我只有45.0.1,所以我无法测试...其他人?
乔丹·卡斯珀

@ 2ndGAB更正,我的Firefox已更新为46.0.1,此代码仍在那儿工作。你可否确认?
乔丹·卡斯珀 Jordan Kasper)

@jakerella对我来说很奇怪,设置输入文件选择器值会触发安全性异常。我成功使用的唯一解决方案是$(#myfileselector).trigger('fileselect', [1, ""]);
fralbo

3
input.type =''; input.type ='文件'; //享受
Maxmaxmaximus

81

您需要包装<input type = “file”><form>标签中,然后可以通过重置表单来重置输入:

onClick="this.form.reset()"

7
这是正确的方法。它适用于所有浏览器,并且不会与浏览器实施的任何保护措施相冲突,以防止流氓脚本与文件输入的.value混为一谈。
Eugene Ryabtsev

9
Kinda很酷,虽然对我来说不是,但因为它也会重置此表单上的其他字段。
Starwave

2
类似的jQuery解决方案可能是$("form").get(0).reset();。该.get(0)会返回实际的表单元素,所以你可以使用的reset()功能。
teewuane

74

这是最好的解决方案:

input.value = ''

if(!/safari/i.test(navigator.userAgent)){
  input.type = ''
  input.type = 'file'
}

在所有答案中,这是最快的解决方案。没有输入克隆,没有表格复位!

我在所有浏览器中都对其进行了检查(它甚至具有IE8支持)。


4
是否有任何特定的原因也要重置input.type?仅将值设置''为可获得预期结果。
Harshita Sethi

它会onchange在MS Edge中触发事件吗?
hotohoto

@hotohoto我不知道,有Mac OS)
Maxmaxmaximus

1
这需要更多的支持或其他方式,我花了很长时间才找到此答案,这是我发现的唯一可在IE上运行的答案。
sch

input.value =''向IE11中的控制台抛出异常。但是,重置input.type可以在所有浏览器上正常运行。
米罗斯拉夫·贾索

45

如果您有以下情况:

<input type="file" id="fileControl">

然后做:

$("#fileControl").val('');

重置文件控件。


6
最好的解决方案恕我直言。
Serhii Maksymchuk

3
或使用DOM:inputFileEl.value = '';
Ninh Pham

44

您可以克隆它并替换为它,同时保留所有事件:

<input type="file" id="control">

var input = $("#control");

function something_happens() {
    input.replaceWith(input.val('').clone(true));
};

谢谢:Css-tricks.com


1
不幸的是,这不会重置输入值,请参阅此jsFiddle。要获得更好的解决方案,请参见此答案
Gyrocode.com,2015年

1
@ Gyrocode.com如果在重置后第二次上载图像,则此jsFiddle无法正常工作。
Sarthak Singhal,2015年

2
@SarthakSinghal,很遗憾,您编写了错误的代码,应该完成jsfiddle.net/cL1LooLe
Roger Russel

2
@RogerRussel:确实……我在想,为什么上层答案说它只能运行一次,这清楚地表明某种参考正在丢失。实际上是这样,因为最初创建的输入引用后来被新的输入元素替换。
罗伯特·科里特尼克

1
仅仅重置value其他答案中的like似乎比操作DOM更直接。
CodeFinity

40

另一个解决方案(不选择HTML DOM元素)

如果您在该输入上添加了“ change”事件侦听器,则可以在javascript代码中调用(针对某些指定条件):

event.target.value = '';

以HTML为例:

<input type="file" onChange="onChangeFunction(event)">

并且在javascript中:

onChangeFunction(event) {
  let fileList = event.target.files;
  let file = fileList[0];
  let extension = file.name.match(/(?<=\.)\w+$/g)[0].toLowerCase(); // assuming that this file has any extension

  if (extension === 'jpg') {
    alert('Good file extension!');
  }
  else {
    event.target.value = '';
    alert('Wrong file extension! File input is cleared.');
  }

另一种方式来angular2:stackoverflow.com/questions/40165271/...
Belter

这仅适用于.文件扩展名前仅包含一个的文件名。
Ma Kobi '12

没错,我已经编辑了代码,并提供了更通用的方法来获取文件扩展名。
indreed

31

以下代码适用于jQuery。它适用于所有浏览器,并允许保留事件和自定义属性。

var $el = $('#uploadCaptureInputFile');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();

演示

看到这个jsFiddle代码和演示,。

链接

有关更多信息,请参见如何使用JavaScript重置文件输入


1
@alessadro,不,只是<input type="file">具有特定ID的元素。
Gyrocode.com

谢谢你澄清你的答案:) +1
Candlejack'1

1
这是我发现的最干净,最兼容浏览器的解决方案-谢谢。
专利

25

使用纯JavaScript重置文件上传按钮非常容易

这样做的方法很少,但是在许多浏览器中都能正常工作的必须直接的方法是将文件值更改为空,这样就重置了上传文件,还尝试使用纯JavaScript而不是任何框架,我创建了下面的代码,只需将其签出(ES6):

function resetFile() {
  const file = document.querySelector('.file');
  file.value = '';
}
<input type="file" class="file" />
<button onclick="resetFile()">Reset file</button>


如何使用jQuery
Anand Choudhary

1
@AnandChoudhary也可以在jQuery中使用,但是您可以替换const file = document.querySelector('。file'); 使用const file = $('。file'); 或者只是做$('。file')。val(“”); 清空它
Alireza

18

特别是对于Angular

document.getElementById('uploadFile').value = "";

可以,但是如果您使用Angular,它将说“属性'value'在类型'HTMLElement'.any上不存在”

document.getElementById()返回不包含value属性的HTMLElement类型。因此,将其转换为HTMLInputElement

(<HTMLInputElement>document.getElementById('uploadFile')).value = "";

额外:-

但是,我们不应该在角度上使用DOM操作(document.xyz())。

为此,角度提供了@ VIewChild,@ ViewChildren等,它们分别是document.querySelector()和document.queryselectorAll()。

甚至我都没看过。更好地跟随专家的博客

通过这次访问链接1链接2


很高兴我不必使用角度!
user2677034

不可以。只有我找到了这个。那你在用哪个呢?
P Satish Patro

抱歉,我被讽刺了……我只是使用document.getElementById('uploadFile')。value =“”; 因为我不使用角度。
user2677034

好一个。我也这么认为,但是,请使用Angular / React / VUe。这些是路由,组件,服务,dom操作覆盖实现的强大框架
P Satish Patro

14

我用于vuejs

   <input
          type="file"
          ref="fileref"
          @change="onChange"/>

this.$refs.fileref.value = ''

2
谢啦!我以为我永远找不到vuejs的解决方案:D,你疯了我的一天!
Zsoca

1
像魅力一样工作!谢谢
F KIng

8

重置输入文件非常单一

$('input[type=file]').val(null);

如果绑定,请在更改表单的其他字段中重置文件,或使用ajax加载表单。

这个例子适用

选择器,例如is $('input[type=text]')或以下形式的任何元素

事件 clickchange或任何事件

$('body').delegate('event', 'selector', function(){
     $('input[type=file]').val(null) ;
});

5

使用IE 10,我解决了以下问题:

    var file = document.getElementById("file-input");
    file.removeAttribute('value');
    file.parentNode.replaceChild(file.cloneNode(true),file);

哪里:

<input accept="image/*" onchange="angular.element(this).scope().uploadFile(this)" id="file-input" type="file"/>


5

有很多方法,我建议将ref附加到输入中。

<input
    id="image"
    type="file"
    required
    ref={ref => this.fileInput = ref}
    multiple
    onChange={this.onFileChangeHandler}
/>

提交后清除价值。

this.fileInput.value = "";


4

使用angular可以创建模板变量并将其值设置为 null

<input type="file" #fileUploader />
<button (click)="fileUploader.value = null">Reset from UI</button>

或者您可以创建一种方法来像这样重置

component.ts

  @ViewChild('fileUploader') fileUploader:ElementRef;

  resetFileUploader() { 
    this.fileUploader.nativeElement.value = null;
  }

模板

<input type="file"/>
<button (click)="resetFileUploader()">Reset from Component</button>

stackblitz演示


2

您无法重置它,因为它是只读文件。您可以克隆它来解决此问题。



2

可以这样做

var inputfile= $('#uploadCaptureInputFile')
$('#reset').on('click',function(){
inputfile.replaceWith(inputfile.val('').clone(true));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />
<a href="" id="reset">Reset</a>



1

jQuery解决方案:

    $('input').on('change',function(){
                $(this).get(0).value = '';
                $(this).get(0).type = '';
                $(this).get(0).type = 'file';
            });

考虑填充此答案以解释其工作原理。
Bug,

@Bugs猜想这是不言而喻的。on change触发文件输入事件后,该值将被清除。输入的类型从无重置为文件。

2
@Jordy是的,我知道它的作用:)我只是在想,通过一打其他答案,值得一试。它在我审核时出现。实际上,他们可以复制您的评论以进一步扩大评论范围。总是值得尝试解释为什么您认为代码可以解决OP问题。
错误

1

我面对ng2-file-upload的角度问题。如果您正在寻找角度的解决方案,请参考以下代码

HTML:

<input type="file" name="myfile" #activeFrameinputFile ng2FileSelect [uploader]="frameUploader" (change)="frameUploader.uploadAll()" />

零件

import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';

@ViewChild('activeFrameinputFile ')InputFrameVariable: ElementRef;

this.frameUploader.onSuccessItem = (item, response, status, headers) => {

`this.`**InputFrameVariable**`.nativeElement.value = '';`

};


1
<input type="file" id="mfile" name="mfile">
<p>Reset</p>

<script>
$(document).ready(function(){
$("p").click(function(){

            $("#mfile").val('');
            return false;

    });
});


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

0

如果您的表单中有多个文件,但只希望重置其中一个:

如果您使用boostrap,jquery,filestyle来显示输入文件形式:

$("#"+idInput).filestyle('clear');

0
var fileInput = $('#uploadCaptureInputFile');
fileInput.replaceWith(fileInput.val('').clone(true));

0

也适用于动态控件。

Java脚本

<input type="file" onchange="FileValidate(this)" />

function FileValidate(object) {
    if ((object.files[0].size / 1024 / 1024) > 1) {   //greater than 1 MB         
        $(object).val('');
    }     
}

jQuery查询

<input type="file" class="UpoloadFileSize">

$(document).ready(function () {

    $('.UpoloadFileSize').bind('change', function () {                
        if ((this.files[0].size / 1024000) > 1.5) { //greater than 1.5 MB
            $(this).val('');
            alert('Size exceeded !!');
        }
    });

});

0

function resetImageField() {
    var $el = $('#uploadCaptureInputFile');                                        
    $el.wrap('<form>').closest('form').get(0).reset();
    $el.unwrap();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />
<button onclick="resetImageField()">Reset field</button>

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.