come attivare l'evento sulla selezione del file


95

Ho un modulo come

<form  onSubmit="return disableForm(this);" action="upload.php" method="post" name="f" id="wizecho" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button onClick="return disableForm(this),ajaxUpload(this.form,'wizecho_upload.php', '&lt;br&gt;Uploading image please wait.....&lt;br&gt;'); return false;">
        Upload Image
    </button>
</form>

È caricare un'immagine.

Qui devo fare clic sul pulsante per caricare l'immagine e devo usare l' onClickevento. Voglio rimuovere il pulsante di caricamento e non appena il file è selezionato all'ingresso, voglio attivare l'evento. Come lo faccio??


Se sei preoccupato di selezionare lo stesso file due volte, @applecrusher ha una soluzione migliore rispetto alla risposta selezionata stackoverflow.com/a/40581284/1520304
Will Farley

Risposte:


128

Utilizza l'evento change sull'input del file.

$("#file").change(function(){
         //submit the form here
 });

30
e cosa succede quando invii il modulo in modo asincrono, non esci dalla pagina e poi tenti di caricare di nuovo lo stesso file? Questo codice verrà eseguito solo una volta, la seconda volta, selezionando lo stesso file non verrà eseguito un evento di modifica
Christopher Thomas

6
L'obiezione di @ChristopherThomas è esattamente il motivo per cui sono qui, e fortunatamente c'è una risposta molto sottovalutata che lo risolve, anni dopo: stackoverflow.com/a/40581284/4526479
Kyle Baker

1
l'evento change non si attiva quando seleziono di nuovo lo stesso file. Qualche altro modo che può funzionare ogni volta?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

1
@ Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ Vedi il commento appena sopra il tuo.
David Lopez

3
Il fatto che la risposta non utilizzi javascript puro è semplicemente sbagliato
Dimitris Filippou

68

Puoi iscriverti all'evento onchange nel campo di input:

<input type="file" id="file" name="file" />

e poi:

document.getElementById('file').onchange = function() {
    // fire the upload here
};

49

Questa è una vecchia domanda che necessita di una nuova risposta che affronterà la preoccupazione di @Christopher Thomas sopra nei commenti della risposta di accettazione. Se non esci dalla pagina e quindi selezioni il file una seconda volta, devi cancellare il valore quando fai clic o esegui un touchstart (per dispositivi mobili). Quanto segue funzionerà anche quando esci dalla pagina e utilizzi jquery:

//the HTML
<input type="file" id="file" name="file" />



//the JavaScript

/*resets the value to address navigating away from the page 
and choosing to upload the same file */ 

$('#file').on('click touchstart' , function(){
    $(this).val('');
});


//Trigger now when you have selected any file 
$("#file").change(function(e) {
    //do whatever you want here
});

Questo cross-browser è compatibile? Sembra che stia solo usando val(''), il che non funziona nella maggior parte dei browser.
Sean Kendle

Su quale browser non funziona quello che hai provato? Prova a clonare l'oggetto con se stesso se è ancora un problema per te.
applecrusher

2
Il mio problema stava usando element.setAttribute("value", "")Se non stai usando jQuery devi usare element.value = ""per far sì che l'elemento del file si cancelli davvero correttamente.
Phil

1

Fai quello che vuoi fare dopo che il file è stato caricato con successo. Appena dopo il completamento dell'elaborazione del file, imposta il valore del controllo del file su una stringa vuota. Così il .change () verrà sempre chiamato anche se il nome del file cambia o meno. come per esempio puoi fare questa cosa e ha funzionato per me come un fascino

  $('#myFile').change(function () {
    LoadFile("myFile");//function to do processing of file.
    $('#myFile').val('');// set the value to empty of myfile control.
    });

1

Soluzione per gli utenti vue, risolvendo il problema quando si carica lo stesso file più volte e l'evento @change non si attiva:

 <input
      ref="fileInput"
      type="file"
      @click="onClick"
    />
  methods: {
    onClick() {
       this.$refs.fileInput.value = ''
       // further logic for file...
    }
  }

<input type = "file" @ change = "onFileChange" class = "input upload-input" ref = "inputFile" /> self. $ refs.inputFile.value = ''
Pragati Dugar

0

<input type = "file" @ change = "onFileChange" class = "input upload-input" ref = "inputFile" />

onFileChange(e) {
//upload file and then delete it from input 
 self.$refs.inputFile.value = ''
}
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.