使用jQuery清除<input type='file' />的内容

559

使用jQuery清除控件的值是否可能?我已经尝试了以下方法:

$('#control').attr({ value: '' }); 

但是它没有起作用。

27个回答

5

我一直在寻找一种简单干净的方式来清除HTML文件输入,上面的答案都很棒,但是没有一个真正回答了我要找的东西,直到我在网上发现了一种简单而优雅的方法来做到这一点:

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

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

所有功劳归功于Chris Coyier

// 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>


5
我能够使用以下代码使我的工作正常:

我使用以下代码使我的工作正常:

var input = $("#control");    
input.replaceWith(input.val('').clone(true));

5

出于安全考虑,文件输入的值是只读的。您无法通过编程方式将其清空(除了调用表单的reset()方法,该方法的范围不仅限于该字段)。


17
我感到困惑 - 我尝试了$("#inputControl").val(""),它确实清空了该字段。我错过了什么吗? - Sampson
1
@Jonathan,对我也有效,但如果你将其设置为其他任何值,它都会出现安全错误。在FF4中进行了测试。 - Brenden
reset() 是 JS 的本地方法,因此如果您通过 jQuery 选择表单,则需要将元素从 jQuery 范围中取出。$("form#myForm")[0].reset(); - Chris Stephens
5
它在你这里运行正常是因为你没有在IE中操作。这个安全问题只会被IE阻止。定期清除数值在Chrome和Firefox中都有效,但不适用于IE。 - VoidKing

4

.clone()方法在Opera(和其他可能的浏览器)中不起作用。它保留了内容。

对我来说,最接近的方法是Jonathan早期提供的,但在我的情况下,确保字段保留其名称、类等,会使代码变得混乱。

像Quentin所说的,这样做可能很好:

function clearInput($source) {
    var $form = $('<form>')
    var $targ = $source.clone().appendTo($form)
    $form[0].reset()
    $source.replaceWith($targ)
}

这个在所有主流浏览器中测试过了吗? - Shawn
它在最新版本的Chrome/FF/Opera和IE8中似乎运行良好。我看不出为什么它不能在任何东西上工作 - 表单上的重置选项已经存在很长时间了。 - SpoonNZ

4

我已经成功地使用以下方法使它工作...

function resetFileElement(ele) 
{
    ele.val(''); 
    ele.wrap('<form>').parent('form').trigger('reset');   
    ele.unwrap();
    ele.prop('files')[0] = null;
    ele.replaceWith(ele.clone());    
}

这已在IE10、FF、Chrome和Opera中进行了测试。

有两个注意点...

  1. 如果您刷新页面,仍然无法在FF中正常工作,文件元素将重新填充所选文件。我不知道它从哪里获取此信息。我可能需要尝试清除与文件输入元素相关的其他内容?

  2. 记得对文件输入元素附加的任何事件使用委派,这样在克隆时它们仍然起作用。

我不明白的是,到底是谁认为不允许您清除无效不可接受的文件选择的输入字段是一个好主意?

好吧,不要让我使用值动态设置它,这样我就无法从用户的操作系统中获取文件,但是让我清除无效的选择而不重置整个表单。

毕竟,“接受”除了过滤器外什么也做不了,在IE10中,它甚至不理解MS Word的mime类型,这真是一个笑话!


这个几乎可以工作了。你需要做的一件事是在文件数组上使用.pop()而不是将其设置为null,这似乎可以正确清除文件。 - kmacdonald

2

在我的Firefox 40.0.3上,只有这个才能工作

 $('input[type=file]').val('');
 $('input[type=file]').replaceWith($('input[type=file]').clone(true));

2
$('input[type=file]').replaceWith($('input[type=file]').clone(true).val('')); - Andrei

2

在任何浏览器中都能够正常工作。

        var input = $(this);
        var next = this.nextSibling;
        var parent = input.parent();
        var form = $("<form></form>");
        form.append(input);
        form[0].reset();
        if (next) {
            $(next).before(input);
        } else {
            parent.append(input);
        }

1
我尝试了大多数用户提到的技术,但它们在所有浏览器中都没有起作用。例如:clone()在Firefox中不适用于文件输入。 最终,我手动复制了文件输入,然后用复制品替换了原始输入。这在所有浏览器中都有效。
<input type="file" id="fileID" class="aClass" name="aName"/>

var $fileInput=$("#fileID");
var $fileCopy=$("<input type='file' class='"+$fileInput.attr("class")+" id='fileID' name='"+$fileInput.attr("name")+"'/>");
$fileInput.replaceWith($fileCopy);

0
function clear() {
    var input = document.createElement("input");
    input.setAttribute('type', 'file');
    input.setAttribute('value', '');
    input.setAttribute('id', 'email_attach');

    $('#email_attach').replaceWith( input.cloneNode() );
}

0

$("input[type=file]").wrap("<div id='fileWrapper'/>");
$("#fileWrapper").append("<div id='duplicateFile'   style='display:none'>"+$("#fileWrapper").html()+"</div>");
$("#fileWrapper").html($("#duplicateFile").html());

1
嗨,Niraj。欢迎。这个答案可能是正确的,但它需要一些解释。 - tomfanning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接