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

IT技术 javascript html input-type-file
2021-01-16 06:16:50

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

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

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

这可能吗?

6个回答

有 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);
        }
    }
}
不,你不需要。表单元素尚未附加到页面文档树中。
2021-03-16 06:16:50
之后我们不应该也删除创建的表单吗?
2021-04-04 06:16:50
如果您想保留以编程方式添加到元素的事件和其他属性,那么使用方法 2. 或 3. 只是警告。就我而言,我向表单元素添加了一个 onclick 事件,该事件在表单重置后消失。在这种情况下,方法 1. 更好。(这在 2. 中被注意到,但也可能在 3 中发生。)
2021-04-11 06:16:50

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 上测试。

将该值设置为''不适用于所有浏览器。

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

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

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

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

不幸的是,我没有在all browsers...中看到它,它在 IE8、IE9 或 IE10 中不起作用(但在 IE11 中有效)。
2021-03-16 06:16:50
好吧,当。我没有测试旧版本的 IE 浏览器。对不起。
2021-04-08 06:16:50

不幸的是,上述答案似乎都没有涵盖所有基础 - 至少在我使用 vanilla 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)的 vanilla 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"));
@Fahmi - 不,不应该
2021-03-13 06:16:50
哦,我以为 IE8/9/10 在尝试将值设置为null. 介意解释一下放在ctrl.value = null;内的意义是try...catch什么?对不起,新问题。
2021-03-13 06:16:50
这就是答案。对这个问题有这么多答案的问题之一——不仅在这个页面上,而且在其他论坛上搜索也是如此,你可以清除“选择了 3 个文件”文本,但它实际上并没有清除 http 文件队列。然后发生的情况是,下次尝试上传时,您只能选择一个文件,更糟糕的是,它会保存到上一个文件夹中。此答案将清除两者,您可以像上传第一组文件一样轻松地继续上传下一组文件。
2021-03-19 06:16:50
如果没有if声明放在里面catch块?
2021-04-02 06:16:50
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);- 实际上我们在什么时候清除了value,因为cloneNode也复制了它?
2021-04-02 06:16:50

解决方案

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

var $el = $('#your-input-id');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();

演示

有关代码和演示,请参阅此 jsFiddle

链接