2010-04-27 20 views
61

Sto provando ad abbracciare jQuery al 100% con la sua semplice ed elegante API ma ho incontrato un'incoerenza tra l'API e l'HTML lineare che non riesco risolvere.jQuery change method on input type = "file"

Ho uno script di caricamento file AJAX (che funziona correttamente) che voglio eseguire ogni volta che cambia il valore di input del file. Ecco il mio codice di lavoro:

<input type="file" size="45" name="imageFile" id="imageFile" onchange="uploadFile()"> 

Quando converto l'evento onchange ad un'implementazione jQuery:

$('#imageFile').change(function(){ uploadFile(); }); 

il risultato non è lo stesso. Con l'attributo onchange la funzione uploadFile() viene richiamata ogni volta che il valore viene modificato come previsto. Ma con il gestore di eventi jQuery API .change(), l'evento scatta solo la prima volta che un valore cambia. Qualsiasi variazione di valore dopo viene ignorata. Questo mi sembra sbagliato ma sicuramente non può essere una svista da parte di jQuery, giusto?

Qualcun altro ha riscontrato lo stesso problema e avete una soluzione alternativa o una soluzione al problema diversa da quella che ho descritto sopra?

+1

Stai utilizzando IE per caso? – spig

+0

Evito generalmente IE come la peste. LOL Ma seriamente, sviluppo in Firebox in modo da poter sfruttare Firebug e le sue meraviglie e quindi eseguire test in IE, Chrome e Safari. Perché lo chiedi? Il metodo .live() (risposta sotto) ha risolto questo problema per me. – gurun8

+0

@ gurun8 Perché il parametro uploadFile() non ha alcun parametro? Voglio chiamare un metodo ASP.NET MVC come questo, ma il javascript dovrebbe inviare il file che vuole caricare come parametro –

risposta

81

è l'uploader Ajax che aggiorna l'elemento di input? se è così si dovrebbe prendere in considerazione l'utilizzo del metodo .live().

$('#imageFile').live('change', function(){ uploadFile(); }); 

aggiornamento:

da jQuery 1.7+ si dovrebbe usare ora .on()

$(parent_element_selector_here or document).on('change','#imageFile' , function(){ uploadFile(); }); 
+4

Grazie per l'aggiornamento –

+5

funziona per IE ???? –

+1

L'evento di modifica dei binding in Jquery non funzionerà in IE <9, ma utilizza nativamente onchange. – Sanjeev

10

non ho potuto ottenere IE8 + per funzionare con l'aggiunta di un gestore di eventi jQuery per il tipo di ingresso di file . Ho dovuto andare vecchia scuola e aggiungere l'attributo della onchange="" al tag input:

<input type='file' onchange='getFilename(this)'/> 

function getFileName(elm) { 
    var fn = $(elm).val(); 
    .... 
} 
56

Come di jQuery 1.7, il metodo .Live() è deprecato. Usa .on() per allegare gestori di eventi. Gli utenti di versioni precedenti di jQuery dovrebbero usare .delegate() preferibilmente a .live(). Refer: http://api.jquery.com/on/

$('#imageFile').on("change", function(){ uploadFile(); }); 
+1

Un bel problema con la deprecazione di live(), ma il modulo che mostri non funziona. Il modulo mostrato da @LuisMelgrati funziona. E infatti, la pagina a cui ti colleghi fornisce il secondo modulo come sostituto di questa funzione. – PhiLho

+0

Grazie a @PhiLho, ho appena scoperto il collegamento a cui mi riferivo was .live() not .on() –

Problemi correlati