É possível limpar um <input type='file' />
valor de controle com jQuery? Eu tentei o seguinte:
$('#control').attr({ value: '' });
Mas não está funcionando.
Fácil: envolva um <form>
elemento, chame reset no formulário e remova o formulário usando .unwrap()
. Diferente das .clone()
soluções de outra forma nesse encadeamento, você acaba com o mesmo elemento no final (incluindo propriedades customizadas que foram definidas nele).
Testado e trabalhando em Opera, Firefox, Safari, Chrome e IE6 +. Também funciona em outros tipos de elementos de formulário, com exceção de type="hidden"
.
window.reset = function(e) {
e.wrap('<form>').closest('form').get(0).reset();
e.unwrap();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
<input id="file" type="file">
<br>
<input id="text" type="text" value="Original">
</form>
<button onclick="reset($('#file'))">Reset file</button>
<button onclick="reset($('#text'))">Reset text</button>
Como o Timo observa abaixo, se você tiver os botões para acionar a redefinição do campo dentro do campo <form>
, deverá chamar .preventDefault()
o evento para impedir que o <button>
envio seja acionado .
Não funciona no IE 11 devido a um erro não corrigido. O texto (nome do arquivo) é limpo na entrada, mas sua File
lista permanece preenchida.
reset()
para eg.reset2()
, porque pelo menos no Chrome todos os campos são limpos, se estiveremreset()
. E adicione event.preventDefault () depois de limpar a chamada para impedir o envio. Desta forma:<button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>
. Exemplo de trabalho: jsfiddle.net/rPaZQ/23 .Resposta rápida: substitua-o.
No código abaixo, eu uso o
replaceWith
método jQuery para substituir o controle por um clone próprio. Caso você tenha algum manipulador vinculado a eventos nesse controle, queremos preservá-lo também. Para fazer isso, passamostrue
como o primeiro parâmetro doclone
método.Fiddle: http://jsfiddle.net/jonathansampson/dAQVM/
Se a clonagem, enquanto preserva os manipuladores de eventos, apresenta qualquer problema que você possa considerar ao usar a delegação de eventos para manipular cliques neste controle a partir de um elemento pai:
Isso evita a necessidade de qualquer manipulador ser clonado junto com o elemento quando o controle está sendo atualizado.
fonte
input.value = null;
O Jquery deve cuidar dos problemas entre navegadores / navegadores antigos para você.
Isso funciona em navegadores modernos que eu testei: Chromium v25, Firefox v20, Opera v12.14
Usando jquery 1.9.1
HTML
Jquery
Em jsfiddle
A seguinte solução javascript também funcionou para mim nos navegadores mencionados acima.
Em jsfiddle
Não tenho como testar com o IE, mas teoricamente isso deve funcionar. Se o IE for diferente o suficiente para que a versão Javascript não funcione porque a MS o fez de uma maneira diferente, na minha opinião, o método jquery deve lidar com isso para você; caso contrário, vale a pena apontar para a equipe jquery junto com o método que o IE exige. (Vejo pessoas dizendo "isso não funcionará no IE", mas nenhum javascript de baunilha para mostrar como ele funciona no IE (supostamente um "recurso de segurança"?), Talvez relate isso como um bug para a MS também (se eles conte-o como tal), para que seja corrigido em qualquer versão mais recente)
Como mencionado em outra resposta, uma postagem no fórum jquery
Mas o jquery agora removeu o suporte para testes de navegador, jquery.browser.
Essa solução javascript também funcionou para mim, é o equivalente baunilha do método jquery.replaceWith .
Em jsfiddle
O importante a ser observado é que o cloneNode método não preserva os manipuladores de eventos associados.
Veja este exemplo.
Em jsfiddle
Mas o jquery.clone oferece isso [* 1]
Em jsfiddle
[* 1] O jquery é capaz de fazer isso se os eventos foram adicionados pelos métodos do jquery, pois mantém uma cópia em jquery.data ; ele não funciona de outra forma; portanto, é um truque / solução alternativa e significa que as coisas não são compatível entre diferentes métodos ou bibliotecas.
Em jsfiddle
Você não pode obter o manipulador de eventos anexado diretamente do próprio elemento.
Aqui está o princípio geral no vanilla javascript, é assim que o jquery e todas as outras bibliotecas o fazem (aproximadamente).
Em jsfiddle
É claro que o jquery e outras bibliotecas têm todos os outros métodos de suporte necessários para manter essa lista; isso é apenas uma demonstração.
fonte
.val('')
. Não é apenas mais simples do que clonar o elemento de upload ou adicionar um formulário aninhado? +1..val("")
) funcionou perfeitamente, obrigado. Muito mais simples do que clonar a entrada e substituí-la também.Por razões óbvias de segurança, você não pode definir o valor de uma entrada de arquivo, nem mesmo para uma sequência vazia.
Tudo o que você precisa fazer é redefinir o formulário em que o campo ou se você deseja redefinir apenas a entrada de arquivo de um formulário contendo outros campos, use o seguinte:
Aqui está um exemplo: http://jsfiddle.net/v2SZJ/1/
fonte
Isso funciona para mim.
http://forum.jquery.com/topic/how-to-clear-a-file-input-in-ie
Espero que ajude.
fonte
No IE8, eles fizeram o campo Upload de arquivos somente leitura por segurança. Veja a postagem no blog da equipe do IE :
fonte
$("#control").val('')
é tudo o que você precisa! Testado no Chrome usando o JQuery 1.11Outros usuários também testaram no Firefox.
fonte
Fiquei preso com todas as opções aqui. Aqui está um truque que eu fiz que funcionou:
e você pode acionar a redefinição usando jQuery com um código semelhante a este:
(jsfiddle: http://jsfiddle.net/eCbd6/ )
fonte
Eu acabei com isso:
pode não ser a solução mais elegante, mas funciona até onde eu sei.
fonte
Eu usei https://github.com/malsup/form/blob/master/jquery.form.js , que tem uma função chamada
clearInputs()
, que é cross-browser, bem testada, fácil de usar e também lida com problemas do IE e limpeza de campos ocultos se necessário. Talvez seja uma solução um pouco longa para limpar apenas a entrada de arquivos, mas se você estiver lidando com uploads de arquivos entre navegadores, essa solução é recomendada.O uso é fácil:
fonte
O valor das entradas do arquivo é somente leitura (por razões de segurança). Você não pode colocá-lo em branco programaticamente (exceto chamando o método reset () do formulário, que tem um escopo mais amplo do que apenas esse campo).
fonte
Consegui fazer o meu trabalhar com o seguinte código:
fonte
Eu tenho procurado uma maneira simples e limpa de limpar a entrada de arquivos HTML, as respostas acima são ótimas, mas nenhuma delas realmente responde ao que estou procurando, até que me deparei com a Web com uma maneira simples e elegante de fazer isso:
todo o crédito é para Chris Coyier .
fonte
A
.clone()
coisa não funciona no Opera (e possivelmente em outros). Mantém o conteúdo.O método mais próximo aqui para mim foi o de Jonathan, no entanto, garantindo que o campo preservasse seu nome, classes, etc., gerando um código confuso no meu caso.
Algo assim pode funcionar bem (graças a Quentin também):
fonte
Eu consegui fazer isso funcionar usando o seguinte ...
Isso foi testado no IE10, FF, Chrome e Opera.
Existem duas advertências ...
Ainda não funciona corretamente no FF, se você atualizar a página, o elemento file será preenchido novamente com o arquivo selecionado. De onde está obtendo essa informação está além de mim. O que mais relacionado a um elemento de entrada de arquivo eu poderia tentar limpar?
Lembre-se de usar a delegação em todos os eventos anexados ao elemento de entrada do arquivo, para que eles ainda funcionem quando o clone for criado.
O que não entendo é que quem pensou que não permitir que você limpe um campo de entrada de uma seleção de arquivo inaceitável inválida era uma boa idéia?
OK, não me permita defini-lo dinamicamente com um valor para não poder lixivar arquivos do sistema operacional de um usuário, mas deixe-me limpar uma seleção inválida sem redefinir um formulário inteiro.
Não é como 'aceitar' faz nada além de um filtro e, no IE10, ele nem entende os tipos de mímica do MS Word, é uma piada!
fonte
.pop()
a matriz de arquivos em vez de defini-la como nula. isso parece limpar o arquivo corretamente.No meu Firefox 40.0.3, apenas trabalho com este
fonte
funciona para mim em todos os navegadores.
fonte
Tentei com a maioria das técnicas mencionadas pelos usuários, mas nenhuma delas funcionou em todos os navegadores. ou seja: clone () não funciona no FF para entradas de arquivo. Acabei copiando manualmente a entrada do arquivo e substituindo o original pela copiada. Funciona em todos os navegadores.
fonte
fonte
Isso funciona com Chrome, FF e Safari
Pode não funcionar com o IE ou Opera
fonte
Torne-o assíncrono e redefina-o depois que as ações desejadas do botão forem executadas.
fonte
fonte
Isto não funciona para mim:
assim, no asp mvc, uso recursos de barbear para substituir a entrada de arquivo. primeiro, crie uma variável para a string de entrada com Id e Nome e, em seguida, use-a para mostrar na página e substituir no botão de redefinição, clique em:
fonte
Uma maneira fácil é alterar o tipo de entrada e alterá-lo novamente.
Algo assim:
fonte
Você pode substituí-lo com o seu clone assim
Mas isso clona com seu valor também, então é melhor você
fonte
É fácil lol (funciona em todos os navegadores [exceto ópera]):
JS Fiddle: http://jsfiddle.net/cw84x/1/
fonte
O que? Na sua função de validação, basta colocar
Supondo que upload seja o nome:
Estou usando JSP, não tenho certeza se isso faz diferença ...
Funciona para mim e acho que é muito mais fácil.
fonte