come ripristinare <input type = "file">


401

Sto sviluppando un'app metro con VS2012 e Javascript

Voglio ripristinare il contenuto del mio input di file:

<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />

Come dovrei farlo?


1
Cosa intendi per contenuto?
Maess,

3
vuoi dire, dopo che l'utente seleziona un file, vuoi resettare il file selezionato su "niente"?
ddavison,


14
esso sembra che un semplice inputElement.value = ""fa il trucco bene senza ricorrere alla clonazione o la confezione come suggerito. Lavora in CH (46), IE (11) e FF (41)
Robert Koritnik,

Risposte:


372

La soluzione jQuery che @ dhaval-marthak ha pubblicato nei commenti ovviamente funziona, ma se guardi la chiamata reale a jQuery è abbastanza facile vedere cosa sta facendo jQuery, semplicemente impostando l' valueattributo su una stringa vuota. Quindi in JavaScript "puro" sarebbe:

document.getElementById("uploadCaptureInputFile").value = "";

15
Grazie! Se hai già il riferimento jquery comunque, $ input.val ("") funzionerà come al solito.
Natan

@ 2ndGAB Hmm ... Ho solo 45.0.1, quindi non posso testare ... nessun altro?
Jordan Kasper,

@ Correzione 2ndGAB, Il mio Firefox è appena stato aggiornato alla 46.0.1 e questo codice funziona ancora lì. Puoi confermare?
Jordan Kasper,

@jakerella è strano, per me, impostare un valore di selezione del file di input genera un'eccezione di sicurezza. L'unica soluzione che uso con successo è$(#myfileselector).trigger('fileselect', [1, ""]);
fralbo

3
input.type = ''; input.type = 'file'; // divertiti
Maxmaxmaximus,

81

È necessario per avvolgere <input type = “file”>a <form>tag e quindi è possibile ripristinare ingresso resettando il modulo:

onClick="this.form.reset()"

7
Questo è il metodo corretto Funziona in tutti i browser e non è in conflitto con le protezioni implementate dai browser per impedire agli script non autorizzati di fare confusione con il valore .value di input del file.
Eugene Ryabtsev,

9
Un po 'figo, non per me, perché ripristina anche altri campi in questo modulo.
Starwave,

2
Potrebbe essere una soluzione jQuery simile $("form").get(0).reset();. Il .get(0)restituirà l'elemento di forma attuale in modo da poter utilizzare la reset()funzione di.
teewuane,

74

Questa è la soluzione MIGLIORE:

input.value = ''

if(!/safari/i.test(navigator.userAgent)){
  input.type = ''
  input.type = 'file'
}

Di tutte le risposte qui questa è la soluzione più veloce. Nessun clone di input, nessun modulo ripristinato!

L'ho controllato in tutti i browser (ha persino il supporto IE8).


4
C'è qualche motivo specifico per ripristinare input.typeanche quello? L'impostazione del solo valore su ''sta dando il risultato atteso.
Harshita Sethi

Spara onchangeevento in MS Edge?
hotohoto,

@hotohoto non lo so, a have mac os)
Maxmaxmaximus

1
Questo ha bisogno di altri voti o qualcosa del genere, ho impiegato troppo tempo per trovare questa risposta, questa è l'unica che ho trovato che funziona su Internet Explorer.
sch

input.value = '' genera un'eccezione alla console in IE11. Tuttavia, il ripristino di input.type funziona su tutti i browser senza errori.
Miroslav Jasso,

45

Nel caso in cui tu abbia:

<input type="file" id="fileControl">

quindi fai semplicemente:

$("#fileControl").val('');

per ripristinare il controllo del file.


6
La migliore soluzione IMHO.
Serhii Maksymchuk,

3
Oppure usa DOM:inputFileEl.value = '';
Ninh Pham

44

Puoi semplicemente clonarlo e sostituirlo con se stesso, con tutti gli eventi ancora collegati:

<input type="file" id="control">

e

var input = $("#control");

function something_happens() {
    input.replaceWith(input.val('').clone(true));
};

Grazie: Css-tricks.com


1
Purtroppo questo non reimposta il valore di input, vedi questo jsFiddle . Per una soluzione migliore, vedi questa risposta .
Gyrocode.com,

1
@ Gyrocode.com Questo jsFiddle non funziona se l'immagine viene caricata una seconda volta dopo il ripristino.
Sarthak Singhal,

2
@SarthakSinghal, Purtroppo hai scritto il codice sbagliato, avresti dovuto fare jsfiddle.net/cL1LooLe
Roger Russel,

2
@RogerRussel: Esattamente ... Mi chiedevo come mai le risposte superiori dicessero che funziona solo una volta, il che è un chiaro indicatore che si sta perdendo una sorta di riferimento. E quello era effettivamente il caso perché inizialmente creato il riferimento di input che è stato successivamente sostituito con un nuovo elemento di input.
Robert Koritnik,

1
Il semplice ripristino del valuelike in altre risposte sembra molto più semplice rispetto alla manipolazione del DOM.
CodeFinity,

40

Un'altra soluzione (senza selezionare elementi DOM HTML)

Se hai aggiunto il listener di eventi 'change' su quell'input, allora nel codice javascript puoi chiamare (per alcune condizioni specificate):

event.target.value = '';

Ad esempio in HTML:

<input type="file" onChange="onChangeFunction(event)">

E in javascript:

onChangeFunction(event) {
  let fileList = event.target.files;
  let file = fileList[0];
  let extension = file.name.match(/(?<=\.)\w+$/g)[0].toLowerCase(); // assuming that this file has any extension

  if (extension === 'jpg') {
    alert('Good file extension!');
  }
  else {
    event.target.value = '';
    alert('Wrong file extension! File input is cleared.');
  }

Un altro modo per angular2: stackoverflow.com/questions/40165271/...
Belter

Funzionerà solo su nomi di file che contengono solo un singolo .davanti all'estensione del file.
Ma Kobi,

Esatto, ho modificato il codice e fornito un approccio più universale per ottenere un'estensione di file.
decretato il

31

SOLUZIONE

Il seguente codice ha funzionato per me con jQuery. Funziona in ogni browser e consente di preservare eventi e proprietà personalizzate.

var $el = $('#uploadCaptureInputFile');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();

DEMO

Vedi questo jsFiddle per il codice e la dimostrazione.

LINK

Vedere Come ripristinare l'input di file con JavaScript per ulteriori informazioni.


1
@alessadro, no, solo elemento <input type="file">con ID specifico.
Gyrocode.com

Grazie chiarisci la tua risposta :) +1
candlejack

1
Questa è la soluzione più pulita e compatibile con il browser che abbia mai trovato - grazie.
Pat

25

Il ripristino di un pulsante di caricamento file è così semplice utilizzando JavaScript puro !

Ci sono alcuni modi per farlo, ma il modo più semplice che funziona bene in molti browser sta cambiando il valore archiviato in nulla, in questo modo il caricamento archiviato viene ripristinato, inoltre provo a usare javascript puro piuttosto che qualsiasi framework, ho creato il codice qui sotto, basta dare un'occhiata (ES6):

function resetFile() {
  const file = document.querySelector('.file');
  file.value = '';
}
<input type="file" class="file" />
<button onclick="resetFile()">Reset file</button>


come fare con jquery
Anand Choudhary

1
@AnandChoudhary funziona anche all'interno di jQuery, ma è possibile sostituire const file = document.querySelector ('. File'); con const file = $ ('. file'); o semplicemente fai $ ('. file'). val (""); per svuotarlo
Alireza,

18

Soprattutto per Angolare

document.getElementById('uploadFile').value = "";

Funzionerà, ma se si utilizza Angular Dirà "Proprietà 'valore' non esiste sul tipo 'HTMLElement'.any"

document.getElementById () restituisce il tipo HTMLElement che non contiene una proprietà value. Quindi, esegui il cast in HTMLInputElement

(<HTMLInputElement>document.getElementById('uploadFile')).value = "";

EXTRA: -

Tuttavia, non dovremmo usare la manipolazione DOM (document.xyz ()) in angolare.

Per fare ciò angolare ha fornito @VIewChild, @ViewChildren, ecc. Che sono rispettivamente document.querySelector (), document.queryselectorAll ().

Anche io non l'ho letto. Meglio seguire i blog degli esperti

Passa attraverso questo link1 , link2


felice di non dover usare angolare!
user2677034

No. FIx sarebbe lì. Solo io ho trovato questo. Quale stai usando allora?
P Satish Patro,

Spiacente, ero sarcastico ... Uso solo document.getElementById ('uploadFile'). Value = ""; come non uso angolare.
user2677034

Ben fatto. Ho pensato lo stesso, ma, usare Angular / React / VUe. Questi sono potenti framework per routing, componente, servizio, manipolazione dom che sovrascrivono l'implementazione
P Satish Patro

14

Uso per vuejs

   <input
          type="file"
          ref="fileref"
          @change="onChange"/>

this.$refs.fileref.value = ''

2
Grazie uomo! Pensavo che non avrei mai trovato una soluzione con vuejs: D, sei pazza la mia giornata!
Zsoca

1
Ha funzionato come un fascino! Grazie
F kIng

8

Il file di input di reimpostazione è su single

$('input[type=file]').val(null);

Se si esegue il binding, ripristinare il file in un altro campo del modulo o caricarlo con ajax.

Questo esempio è applicabile

selettore per esempio è $('input[type=text]')o qualsiasi elemento del modulo

eventi click , changeo qualsiasi evento

$('body').delegate('event', 'selector', function(){
     $('input[type=file]').val(null) ;
});

5

Con IE 10 ho risolto il problema con:

    var file = document.getElementById("file-input");
    file.removeAttribute('value');
    file.parentNode.replaceChild(file.cloneNode(true),file);

dove :

<input accept="image/*" onchange="angular.element(this).scope().uploadFile(this)" id="file-input" type="file"/>


5

Ci sono molti approcci e suggerirò di andare con ref allegato all'input.

<input
    id="image"
    type="file"
    required
    ref={ref => this.fileInput = ref}
    multiple
    onChange={this.onFileChangeHandler}
/>

per cancellare il valore dopo l'invio.

this.fileInput.value = "";


4

Con angolare è possibile creare una variabile modello e impostare il valore su null

<input type="file" #fileUploader />
<button (click)="fileUploader.value = null">Reset from UI</button>

Oppure puoi creare un metodo per reimpostare in questo modo

component.ts

  @ViewChild('fileUploader') fileUploader:ElementRef;

  resetFileUploader() { 
    this.fileUploader.nativeElement.value = null;
  }

modello

<input type="file"/>
<button (click)="resetFileUploader()">Reset from Component</button>

demo di Stackblitz


2

Non è possibile ripristinarlo poiché si tratta di un file di sola lettura. puoi clonarlo per risolvere il problema.



2

Questo potrebbe essere fatto in questo modo

var inputfile= $('#uploadCaptureInputFile')
$('#reset').on('click',function(){
inputfile.replaceWith(inputfile.val('').clone(true));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />
<a href="" id="reset">Reset</a>



1

soluzione jQuery:

    $('input').on('change',function(){
                $(this).get(0).value = '';
                $(this).get(0).type = '';
                $(this).get(0).type = 'file';
            });

Prendi in considerazione questa risposta per spiegare come funziona.
Bug

@Bugs suppongo che questo parli da solo. Quando on changeviene attivato l'evento di input del file, il valore viene cancellato. Il tipo di input viene reimpostato da none a file.

2
@Jordy sì, so cosa fa :) Stavo solo pensando che con una dozzina di altre risposte varrebbe la pena provare a distinguerlo. È apparso mentre stavo recensendo. Potrebbero infatti copiare il tuo commento per completarlo un po 'di più. Vale sempre la pena provare a spiegare perché ritieni che il codice risolva il problema dei PO.
Bug

1

Ho affrontato il problema con ng2-file-upload per angolare. se stai cercando la soluzione in angolare fai riferimento al codice seguente

HTML:

<input type="file" name="myfile" #activeFrameinputFile ng2FileSelect [uploader]="frameUploader" (change)="frameUploader.uploadAll()" />

componente

import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';

@ViewChild('activeFrameinputFile ')InputFrameVariable: ElementRef;

this.frameUploader.onSuccessItem = (item, response, status, headers) => {

`this.`**InputFrameVariable**`.nativeElement.value = '';`

};


1
<input type="file" id="mfile" name="mfile">
<p>Reset</p>

<script>
$(document).ready(function(){
$("p").click(function(){

            $("#mfile").val('');
            return false;

    });
});


Sebbene questo codice possa risolvere la domanda, inclusa una spiegazione di come e perché questo risolva il problema, contribuirebbe davvero a migliorare la qualità del tuo post e probabilmente darebbe più voti positivi. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo per la persona che chiede ora. Si prega di modificare la risposta per aggiungere spiegazioni e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni. Dalla recensione
bip doppio

0

Se nel tuo modulo sono presenti più file ma desideri ripristinarne solo uno:

se usi boostrap, jquery, filestyle per visualizzare il modulo del file di input:

$("#"+idInput).filestyle('clear');

0
var fileInput = $('#uploadCaptureInputFile');
fileInput.replaceWith(fileInput.val('').clone(true));

0

Funziona anche con controlli dinamici.

Javascript

<input type="file" onchange="FileValidate(this)" />

function FileValidate(object) {
    if ((object.files[0].size / 1024 / 1024) > 1) {   //greater than 1 MB         
        $(object).val('');
    }     
}

JQuery

<input type="file" class="UpoloadFileSize">

$(document).ready(function () {

    $('.UpoloadFileSize').bind('change', function () {                
        if ((this.files[0].size / 1024000) > 1.5) { //greater than 1.5 MB
            $(this).val('');
            alert('Size exceeded !!');
        }
    });

});

0

function resetImageField() {
    var $el = $('#uploadCaptureInputFile');                                        
    $el.wrap('<form>').closest('form').get(0).reset();
    $el.unwrap();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />
<button onclick="resetImageField()">Reset field</button>

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.