2010-04-27 7 views
61

Ich versuche, jQuery 100% mit seiner einfachen und eleganten API zu umarmen, aber ich habe eine Inkonsistenz zwischen der API und straight-up HTML, die ich nicht kann herausfinden.jQuery Änderungsmethode bei Eingabe Typ = "Datei"

Ich habe ein AJAX-Datei-Uploader-Skript (das richtig funktioniert), das ich jedes Mal ausführen möchte, wenn sich der Dateieingabewert ändert. Hier ist mein Arbeitscode:

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

Als ich das onchange Ereignis einer jQuery Implementierung konvertieren:

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

das Ergebnis ist nicht das gleiche. Mit dem Attribut 10 wird die Funktion uploadFile() aufgerufen, wenn der Wert wie erwartet geändert wird. Aber mit dem Ereignishandler jQuery API .change() löst das Ereignis nur das erste Mal aus, wenn ein Wert geändert wird. Jede Wertänderung danach wird ignoriert. Das scheint mir falsch zu sein, aber das kann sicherlich kein Versehen von jQuery sein, oder?

Hat jemand anderes das gleiche Problem und haben Sie eine Problemumgehung oder eine Lösung für das Problem als das, was ich oben beschrieben habe?

+1

Verwenden Sie IE zufällig? – spig

+0

Ich vermeide generell IE wie Pest. LOL Aber im Ernst, ich entwickle mich in Firebox, damit ich Firebug und seine Großartigkeit nutzen kann und dann in IE, Chrome und Safari teste. Warum fragst du? Die .live() Methode (Antwort unten) hat dieses Problem für mich gelöst. – gurun8

+0

@ gurun8 Warum hat Ihr uploadFile() keinen Parameter? Ich möchte die ASP.NET MVC-Methode so nennen, aber das Javascript sollte die Datei senden, die es als Parameter hochladen möchte –

Antwort

81

aktualisiert der Ajax-Uploader Ihr Eingabeelement? Wenn ja, sollten Sie die Verwendung der .live() - Methode in Betracht ziehen.

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

Update:

von jQuery 1.7+ Sie jetzt verwenden sollten .on()

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

Danke für das Update –

+5

funktioniert es für IE ???? –

+1

Binding Änderungsereignis in Jquery funktioniert nicht in IE <9, stattdessen verwenden Sie native onchange. – Sanjeev

10

Ich konnte nicht IE8 + erhalten durch Hinzufügen eines jQuery Event-Handler in der Datei Eingabetyp zu arbeiten, . Ich hatte die alte Schule gehen und die das onchange="" Attribut auf den Input-Tag hinzu:

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

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

Ab jQuery 1.7, die .live() Methode ist veraltet. Verwenden Sie .on(), um Ereignishandler anzuhängen. Benutzer älterer Versionen von jQuery sollten .delegate() anstelle von .live() verwenden. Siehe: http://api.jquery.com/on/

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

Guter Fang bei der Vernachlässigung von Live(), aber die Form, die Sie zeigen, funktioniert nicht. Das Formular von @LuisMelgrati funktioniert. Und tatsächlich gibt die Seite, auf die Sie verlinken, das zweite Formular als Ersatz für diese Funktion an. – PhiLho

+0

Danke @PhiLho, habe gerade den Link gefunden, auf den ich mich bezog, war .live() nicht .on() –

Verwandte Themen