Come posso cancellare un input di file HTML con JavaScript?


154

Voglio cancellare l'input del file nel mio modulo.

So di impostare le fonti sullo stesso metodo ... Ma quel metodo non cancella il percorso del file selezionato.

Nota : vorrei evitare di dover ricaricare la pagina, ripristinare il modulo o eseguire una chiamata AJAX.

È possibile?

Risposte:


-10

Che ne dici di rimuovere quel nodo, crearne uno nuovo con lo stesso nome?


46
come intendi, fammi un esempio per favore.

1
perderai i tuoi gestori, come questo: var inputPhoto = document.getElementById ('photoInput'); inputPhoto.addEventListener ('change', handler_file, false);
Rui Martins,

Votato per spiegazione mancante!
Jason

212

Esistono 3 modi per cancellare l'input di file con javascript:

  1. imposta la proprietà del valore su vuota o nulla.

    Funziona con IE11 + e altri browser moderni.

  2. Crea un nuovo elemento di input file e sostituisci quello vecchio.

    Lo svantaggio è che perderai ascoltatori di eventi ed espanderai le proprietà.

  3. Reimposta il modulo proprietario tramite il metodo form.reset ().

    Per evitare di influire su altri elementi di input nello stesso modulo proprietario, possiamo creare un nuovo modulo vuoto e aggiungere l'elemento di input file a questo nuovo modulo e ripristinarlo. In questo modo funziona per tutti i browser.

Ho scritto una funzione JavaScript. demo: 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
Non dovremmo rimuovere anche il modulo creato in seguito?
Andrey,

1
No, non è necessario. l'elemento del modulo non è stato aggiunto all'albero del documento della pagina.
cuixiping

5
Solo un avvertimento, usando gli approcci 2. o 3. potrebbe avere implicazioni per te se vuoi preservare eventi e altri attributi che sono stati aggiunti a un elemento a livello di codice. Nel mio caso, ho aggiunto un evento onclick a un elemento del modulo che è scomparso dopo il reset del modulo. In tal caso, l'approccio 1. è migliore. (Questo è stato notato per 2., ma può succedere anche per 3.)
Wolfie Inu,

86

tl; dr : per i browser moderni, basta usare

input.value = '';

Vecchia risposta:

Che ne dite di:

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

Devo ancora capire perché questo non funziona con WebKit .

Ad ogni modo, funziona con IE9>, Firefox e Opera.
La situazione con webkit è che non riesco a cambiarlo in file.
Con IE8, la situazione è che genera un'eccezione di sicurezza.

Modifica: per webkit, Opera e firefox funziona anche se:

input.value = '';

(controlla la risposta sopra con questa proposta)

Vedrò se riesco a trovare un modo più pulito di fare questo browser senza la necessità del GC.

Edit2:

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

Funziona con la maggior parte dei browser. Non funziona con IE <9, tutto qui.
Testato su Firefox 20, Chrome 24, Opera 12, IE7, IE8, IE9 e IE10.


36

L'impostazione del valore su ''non funziona in tutti i browser.

Prova invece a impostare il valore in nullmodo tale:

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

EDIT: ottengo i motivi di sicurezza molto validi per non consentire a JS di impostare l'input del file, tuttavia sembra ragionevole fornire un semplice meccanismo per cancellare l' output già selezionato. Ho provato a utilizzare una stringa vuota ma non ha funzionato in tutti i browser, ha NULLfunzionato in tutti i browser che ho provato (Opera, Chrome, FF, IE11 + e Safari).

EDIT: Notare che l'impostazione NULLfunziona su tutti i browser mentre l'impostazione su una stringa vuota no.


6
Sfortunatamente non lo vedo in all browsers... non funziona in IE8, IE9 o IE10 (ma funziona in IE11).
freefaller

Bene dang. Non ho testato le versioni precedenti del browser IE. Scusate.
BigMac66,

31

Sfortunatamente nessuna delle risposte di cui sopra sembra coprire tutte le basi - almeno non con i miei test con vaniglia javascript.

  • .value = nullsembra funzionare su FireFox, Chome, Opera e IE11 (ma non IE8 / 9/10 )

  • .cloneNode(e .clone()in jQuery) su FireFox sembra copiare l' .valueover, rendendo quindi inutile il clone.

Quindi ecco la funzione javascript alla vaniglia che ho scritto che funziona su FireFox (27 e 28), Chrome (33), IE (8, 9, 10, 11), Opera (17) ... questi sono gli unici browser attualmente disponibili a me per provare.

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

Il ctrlparametro è l'input del file stesso, quindi la funzione sarebbe chiamata come ...

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

1
Questa è la risposta Uno dei problemi con così tante risposte a questa domanda - non solo in questa pagina, ma anche nella ricerca in altri forum, è che puoi cancellare il testo "3 file selezionati", ma in realtà non cancella i file http coda. Quello che succede allora è che la prossima volta che provi a caricare, puoi selezionare solo un file e, peggio ancora, viene salvato nella cartella del file precedente. Questa risposta cancella entrambi e puoi riprendere a caricare il prossimo set di file con la stessa facilità con cui hai caricato il primo set di file.
TARKUS,

L' ifistruzione non dovrebbe essere inserita all'interno del catchblocco?
Fahmi,

@Fahmi - no, non dovrebbe
freefaller

Oh, ho pensato che IE8 / 9/10 genererà un'eccezione quando si tenta di impostare il valore su null. Ti dispiace spiegare qual è il punto di mettere ctrl.value = null;dentro un try...catchblocco allora? Ci scusiamo per la domanda newb.
Fahmi,

1
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);- a che punto effettivamente cancelliamo il valore, dal momento che cloneNodelo copia anche?
Fahmi,


11

Devi sostituirlo con un nuovo input di file. Ecco come si può fare con jQuery:

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

e utilizzare questa riga quando è necessario cancellare il campo di input (ad esempio in alcuni eventi):

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

Per sostituire l'elemento originale, meglio questo aspetto: stackoverflow.com/questions/1043957/...
Mengdi Gao

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

Modifica:
questo non funziona in IE e Opera, ma sembra funzionare per Firefox, Safari e Chrome.


7
Questo funziona per me, anche se mi chiedo sempre per quanto tempo.
Pekka,

questo non funzionerà, solo in alcuni browser, e anche l'impostazione del valore di un input di file è una violazione della sicurezza ... non è una buona scelta.

5

Avevo lo stesso problema e mi è venuta in mente questa.

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

In realtà è abbastanza facile.

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

3

Ho cercato un modo semplice e chiaro per cancellare l'input di file HTML, le risposte sopra sono fantastiche, ma nessuna di esse risponde davvero a quello che sto cercando, fino a quando non mi sono imbattuto sul web con un modo semplice ed elegante per farlo:

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

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

tutto il merito va a 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>


..e amico mio, questo mi ha aiutato a controllare e visualizzare gli errori in un potenziale caricamento di file. Questo ripristina l'errore e consente all'utente di ricaricare lo stesso file nel caso in cui qualcuno stia cercando qualcosa di simile.
Clinton Dobbs,

1

Le risposte sopra offrono soluzioni un po 'goffe per i seguenti motivi:

  1. Non mi piace dover fare wrapil inputprimo e poi ottenere l'html, è molto complicato e sporco.

  2. Cross browser JS è utile e sembra che in questo caso ci siano troppe incognite per utilizzare in modo affidabile la typecommutazione (che, di nuovo, è un po 'sporca) e l'impostazione valuesu''

Quindi ti offro la mia soluzione basata su jQuery:

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

Fa quello che dice, sostituisce l'input con un clone di se stesso. Il clone non avrà il file selezionato.

vantaggi:

  1. Codice semplice e comprensibile
  2. Nessun avvolgimento o cambio di tipo maldestri
  3. Compatibilità tra browser (correggimi se sbaglio qui)

Risultato: programmatore felice


3
Cross browser compatibility... i miei test dimostrano che FireFox copia sopra .valuecome parte del .clone(), rendendolo quindi inutile
freefaller

@freefaller perché non modificare il valore prima di chiamare replaceWith? Sto usando clone()me stesso e funziona bene in Firefox (non so se questo è ancora il caso per te un anno dopo =))
Abdo

@Abdo - se guardi la mia risposta vedrai che lo faccio
caduta libera il

La domanda non è su jQuery; si sta chiedendo di JavaScript.
Arel,

1

Ecco i miei due centesimi, i file di input sono memorizzati come array, quindi ecco come annullarlo

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

questo restituisce un array vuoto e funziona su tutti i browser


0

Ciò che mi ha aiutato è che ho cercato di recuperare e caricare l'ultimo file selezionato usando un ciclo, invece di svuotare la coda, e ha funzionato. Ecco il codice

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);
}

Spero che questo possa aiutare alcuni.


0

Ho provato la maggior parte delle soluzioni ma non sembra che nessuno funzioni. Tuttavia ho trovato una passeggiata per questo sotto.

La struttura del modulo è: form=> label, inpute submit button. Dopo aver scelto un file, il nome file verrà mostrato dall'etichetta procedendo manualmente in JavaScript.

Quindi la mia strategia è: inizialmente l'invio buttonè disabilitato, dopo aver scelto un file, l' disabledattributo del pulsante di invio verrà rimosso in modo che io possa inviare il file. Dopo l'invio, deseleziono il labelche fa sembrare che io cancelli il fileinput ma in realtà no. Quindi disabiliterò nuovamente il pulsante di invio per impedire l'invio del modulo.

Impostando l'invio button disableo meno, interrompo l'invio del file più volte a meno che non scelga un altro file.


0

Ho cambiato per digitare il testo e di nuovo per digitare il file utilizzando 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");
}

0

la input.value = nullè un metodo di lavoro, ma sarà solo di ingresso trigger changeevento se chiamato da unonclick evento.

Una soluzione a questo sarebbe quella chiamata onchangemanuale di quel gestore ogni volta che è necessario ripristinare l'input.

function reset_input(input) {
    $(input)[0].value = null;
    input_change_handler();
}
function input_change_handler() {
    // this happens when there's been a change in file selection

    if ($(input)[0].files.length) {
        // file(s) selected
    } else {
        // nothing is selected
    }
}
$(input).on('change', input_change_handler);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.