如何清除使用JavaScript输入的HTML文件?


153

我想清除表单中的文件输入。

我知道将源设置为相同的方法...但是该方法不会删除选定的文件路径。

注意:我希望避免重新加载页面,重置表单或执行AJAX调用。

这可能吗?

Answers:


-10

如何删除该节点,创建一个具有相同名称的新节点?


46
你是什​​么意思,请给我一个例子。

1
您将失去像这样的处理程序:var inputPhoto = document.getElementById('photoInput'); inputPhoto.addEventListener('change',handler_file,false);
Rui Martins

投票表决缺少解释!
詹森

211

共有3种清除javascript文件输入的方法:

  1. 将value属性设置为空或null。

    适用于IE11 +和其他现代浏览器。

  2. 创建一个新的文件输入元素并替换旧的。

    缺点是您将丢失事件侦听器和expando属性。

  3. 通过form.reset()方法重置所有者表单。

    为了避免影响同一所有者表单中的其他输入元素,我们可以创建一个新的空表单并将文件输入元素附加到此新表单中并进行重置。这种方式适用于所有浏览器。

我写了一个javascript函数。演示: http : //jsbin.com/muhipoye/1/

function clearInputFile(f){
    if(f.value){
        try{
            f.value = ''; //for IE11, latest Chrome/Firefox/Opera...
        }catch(err){ }
        if(f.value){ //for IE5 ~ IE10
            var form = document.createElement('form'),
                parentNode = f.parentNode, ref = f.nextSibling;
            form.appendChild(f);
            form.reset();
            parentNode.insertBefore(f,ref);
        }
    }
}

1
我们不应该在此之后也删除创建的表单吗?
Andrey

1
不,您不需要。表单元素尚未添加到页面文档树中。
cuixiping 2015年

5
如果要保留以编程方式添加到元素的事件和其他属性,使用方法2或3可能只是个警告。就我而言,我向表单元素添加了onclick事件,该事件在表单重置后消失了。在这种情况下,方法1.更好。(这是针对2的,但也可能针对3的。)
Wolfie Inu

85

tl; dr:对于现代浏览器,只需使用

input.value = '';

旧答案:

怎么样:

input.type = "text";
input.type = "file";

我还是要明白为什么这并不能一起工作的WebKit

无论如何,这适用于IE9>,Firefox和Opera。
webkit的情况是我似乎无法将其更改回文件。
使用IE8,情况是它引发了安全异常。

编辑: 对于webkit,Opera和firefox,这是可行的,但是:

input.value = '';

(请通过此建议检查以上答案)

我将看看是否可以找到一种不需要GC的更简洁的跨浏览器方式。

编辑2:

try{
    inputs[i].value = '';
    if(inputs[i].value){
        inputs[i].type = "text";
        inputs[i].type = "file";
    }
}catch(e){}

适用于大多数浏览器。不适用于IE <9。
在Firefox 20,Chrome 24,Opera 12,IE7,IE8,IE9和IE10上进行了测试。


34

将该值设置为''并非在所有浏览器中都有效。

而是尝试将值设置为null如下所示:

document.getElementById('your_input_id').value= null;

编辑:我有非常有效的安全原因,不允许JS设置文件输入,但是提供一种简单的机制来清除已经选择的输出似乎是合理的。我尝试使用空字符串,但是它不适用于所有浏览器,也不能用于所有尝试使用NULL的浏览器(Opera,Chrome,FF,IE11 +和Safari)。

编辑:请注意,设置为NULL在所有浏览器上均有效,而设置为空字符串则无效。


6
不幸的是,我没有在all browsers...中看到它,它在IE8,IE9或IE10中不起作用(但在IE11中有效)。
自由下落者2014年

好吧 我没有测试IE浏览器的旧版本。抱歉。
BigMac66

31

不幸的是,以上答案似乎都没有涵盖所有基础-至少在我使用香草javascript的测试中没有。

  • .value = null似乎可以在FireFox,Chome,Opera和IE11上运行(但不能在 IE8 / 9/10上运行)

  • .cloneNode(和.clone()jQuery中)在FireFox上似乎复制.value了副本,因此使克隆毫无意义。

因此,这是我编写的可在FireFox(27和28),Chrome(33),IE(8、9、10、11),Opera(17)上运行的普通javascript函数……这些是当前可用的唯一浏览器给我测试。

function clearFileInput(ctrl) {
  try {
    ctrl.value = null;
  } catch(ex) { }
  if (ctrl.value) {
    ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);
  }
}

ctrl参数是文件输入本身,所以该函数将被称为...

clearFileInput(document.getElementById("myFileInput"));

1
这就是答案。这个问题有这么多答案的问题之一-不仅在此页面上,而且在搜索其他论坛时,您都可以清除“已选择3个文件”文本,但实际上并不能清除http文件队列。然后会发生的情况是,下次尝试上载时,只能选择一个文件,更糟糕的是,该文件将保存到上一个文件夹。此答案将同时清除这两个问题,您可以像上载第一组文件一样轻松地继续上载下一组文件。
TARKUS

如果没有if声明放在里面catch块?
法赫米

@Fahmi-不,不应该
自由落体者

哦,我认为IE8 / 9/10尝试将值设置为时会引发异常null。介意解释一下将其ctrl.value = null;放入try...catch积木有什么意义?对不起,新问题。
法赫米

1
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);-我们实际上在什么时候清除了该值,因为cloneNode它也可以复制它?
法赫米


11

您需要用新的文件输入替换它。这是使用jQuery的方法:

var inputFile = $('input[type=field]');
inputFile.wrap('<div />');

并在需要清除输入字段时使用此行(例如,在某些情况下):

inputFile.parent().html( inputFile.parent().html() );

:为了取代原来的元素,这看起来更好stackoverflow.com/questions/1043957/...
梦迪高

9
document.getElementById('your_input_id').value=''

编辑:
这在IE和Opera中不起作用,但似乎对Firefox,safari和chrome有效。


7
这对我有用,尽管我总是问自己要多长时间。
Pekka

仅在某些浏览器中,这是行不通的,并且设置文件输入的值是安全漏洞……不是一个好选择。

5

我遇到了同样的问题,我想到了这个。

var file = document.querySelector('input');
var emptyFile = document.createElement('input');
emptyFile.type = 'file';

document.querySelector('button').onclick = function(){
  file.files = emptyFile.files;
}
<input type='file'>
<button>clear</button>


4

这实际上很容易。

document.querySelector('#input-field').value = '';

3

我一直在寻找清除HTML文件输入的简单干净的方法,上面的答案很不错,但是没有一个能真正满足我的要求,直到我在网上找到了一种简单而优雅的方法:

var $input = $("#control");

$input.replaceWith($input.val('').clone(true));

所有功劳归功于克里斯

// Referneces
var control = $("#control"),
    clearBn = $("#clear");

// Setup the clear functionality
clearBn.on("click", function(){
    control.replaceWith( control.val('').clone( true ) );
});

// Some bound handlers to preserve when cloning
control.on({
    change: function(){ console.log( "Changed" ) },
     focus: function(){ console.log(  "Focus"  ) }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="file" id="control">
<br><br>
<a href="#" id="clear">Clear</a>


..对您来说,这对检查和显示潜在文件上传中的错误有帮助。这会在发生错误时重置,并允许用户重新上传相同的文件,以防有人寻找类似内容。
克林顿·多布斯

1

出于以下原因,以上答案提供了一些笨拙的解决方案:

  1. 我不喜欢到wrapinput第一,然后得到的HTML,这是非常复杂的和肮脏。

  2. 跨浏览器JS很方便,在这种情况下,似乎有太多未知数,无法可靠地使用type切换(同样有点脏)并设置value''

因此,我为您提供了基于jQuery的解决方案:

$('#myinput').replaceWith($('#myinput').clone())

它按照它说的去做,用自身的克隆替换输入。克隆将没有选择文件。

优点:

  1. 简单易懂的代码
  2. 没有笨拙的包装或类型切换
  3. 跨浏览器兼容性(如果我在这里错了,请纠正我)

结果:快乐的程序员


3
Cross browser compatibility...我的测试显示FireFox .value作为的一部分进行复制.clone(),因此使其无用
自由下落者2014年

@freefaller为什么不在调用前更改值replaceWith?我正在使用clone()自己,并且在firefox中工作正常(我不知道一年后还是这样吗?))
Abdo 2015年

@Abdo-如果您查看我的回答,您会看到我的意思
自由落体者

问题不是在问jQuery。询问有关javascript的问题。
Arel

0

帮助我的是,我尝试使用循环来获取并上载最后选择的文件,而不是清除队列,然后它起作用了。这是代码。

for (int i = 0; i <= Request.Files.Count-1; i++)
{
 HttpPostedFileBase uploadfile = files[i];
 Stream fs = uploadfile.InputStream;
 BinaryReader br = new BinaryReader(fs);
 Byte[] imageBytes = br.ReadBytes((Int32)fs.Length);
}

希望这会有所帮助。


0

我尝试了大多数解决方案,但似乎没有人工作。但是我在下面找到了它。

形式的结构是:form=> labelinputsubmit button。选择文件后,通过在JavaScript中手动执行操作,文件名将由标签显示。

所以我的策略是:最初button禁用提交,选择文件后,disabled将删除Submit按钮属性,以便我可以提交文件。提交后,我清除了label,这看起来就像我清除了文件,input但实际上没有。然后,我将再次禁用提交按钮,以防止提交表单。

通过设置是否提交button disable,我会阻止文件多次提交,除非我选择另一个文件。


0

这是我的两分钱,输入文件存储为数组,所以这是如何将其清空

document.getElementById('selector').value = []

这将返回一个空数组,并且可以在所有浏览器上使用


0

我更改为使用setAttribute输入文本并返回至文件

'<input file-model="thefilePic" style="width:95%;" type="file" name="file" id="filepicture" accept="image/jpeg" />'

'var input=document.querySelector('#filepicture');'

if(input != null)
{
    input.setAttribute("type", "text");
    input.setAttribute("type", "file");
}
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.