HTML <input type = 'file'> Evento di selezione file


144

Diciamo che abbiamo questo codice:

<form action='' method='POST' enctype='multipart/form-data'>
    <input type='file' name='userFile'><br>
    <input type='submit' name='upload_btn' value='upload'>
</form>

che risulta in questo:

immagine che mostra il pulsante Sfoglia e carica

Quando l'utente fa clic sul pulsante "Sfoglia ...", viene aperta una finestra di dialogo per la ricerca dei file:

immagine che mostra una finestra di dialogo per la ricerca dei file con un file selezionato

L'utente selezionerà il file facendo doppio clic sul file o facendo clic sul pulsante "Apri".

Esiste un evento Javascript che posso utilizzare per ricevere una notifica dopo aver selezionato il file?


6
Che vecchia interfaccia utente di Windows funky!
El-Burritos,

@ El-Burritos questo è stato pubblicato nel 2010; ovviamente, è una vecchia interfaccia utente di Windows: D
Simon Cheng,

Risposte:


181

Ascolta l'evento change.

input.onchange = function(e) { 
  ..
};

3
lo scriveremo dove .. nei tag di script javascript
Luna

5
sì nei tag script, oppure potresti aggiungerlo come attributo ( <input type="file" onchange="..." />) anche se questo non è raccomandato.
Anurag,

7
Si noti che in IE7 e 8 che l'evento 'change' non passa all'evento form. Devi mettere il tuo listener sul tag <input>.
xer0x,

36
Che dire se un utente deve "ricaricare" un file? onchange non si innescherà, ma dovrebbe comunque ricaricarsi come se lo stesse caricando per la prima volta.
bryc

11
Nota, questo non funziona se l'utente seleziona lo stesso file più di una volta di seguito poiché il file non è cambiato.
bob0the0mighty,

46

Quando è necessario ricaricare il file, è possibile cancellare il valore dell'input. La prossima volta che aggiungi un file, verrà attivato l'evento 'on change'.

document.getElementById('my_input').value = null;
// ^ that just erase the file path but do the trick

5
Funziona bene ma sii consapevole del comportamento strano di IE <11. Non ti consente di modificare il valore dell'input, quindi molto probabilmente avrai bisogno di una soluzione alternativa. stackoverflow.com/questions/9011644/...
Oleksandr Tkalenko

15

modo jQuery:

$('input[name=myInputName]').change(function(ev) {

    // your code
});

4

L'evento Change viene chiamato anche se si fa clic su Annulla.


2
sarebbe utile se
fornissi

Penso che @anthony si riferisca al seguente scenario: Seleziona un file. Ora apri di nuovo il selettore di file, ma questa volta fai clic su Annulla. Poiché non è stato selezionato alcun file la seconda volta, il controllo di input del file viene ripristinato, modificando così la selezione iniziale e l'evento di modifica viene generato.
dvlsc,

L'ho provato su Chrome 83 e l'evento non viene generato quando faccio clic sul pulsante Annulla. Questa risposta è piuttosto vecchia e immagino che debba essere stata risolta, almeno su Chrome.
Saeed Ahadian,

3

È così che l'ho fatto con JS puro:

var files = document.getElementById('filePoster');
var submit = document.getElementById('submitFiles');
var warning = document.getElementById('warning');
files.addEventListener("change", function () {
  if (files.files.length > 10) {
    submit.disabled = true;
    warning.classList += "warn"
    return;
  }
  submit.disabled = false;
});
#warning {
    text-align: center;
}

#warning.warn {
	color: red;
	transform: scale(1.5);
	transition: 1s all;
}
<section id="shortcode-5" class="shortcode-5 pb-50">
    <p id="warning">Please do not upload more than 10 images at once.</p>
    <form class="imagePoster" enctype="multipart/form-data" action="/gallery/imagePoster" method="post">
        <div class="input-group">
  	    <input id="filePoster" type="file" class="form-control" name="photo" required="required" multiple="multiple" />
	    <button id="submitFiles" class="btn btn-primary" type="submit" name="button">Submit</button>
        </div>
    </form>
</section>

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.