2010-04-27 12 views
61

Próbuję objąć jQuery w 100% za pomocą prostego i eleganckiego interfejsu API, ale mam do czynienia z niespójnością między API a prostym kodem HTML, którego nie mogę całkiem rozwiązać.Metoda zmiany jQuery na typie wejściowym = "plik"

Mam skrypt AJAX file uploader (który działa poprawnie), który chcę uruchomić przy każdej zmianie wartości wejściowej pliku. Oto mój kod roboczych:

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

Kiedy przekształcić zdarzenie onchange do realizacji jQuery:

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

wynik nie jest taki sam. Z atrybutem onchange funkcja uploadFile() jest wywoływana w dowolnym momencie, gdy wartość zostanie zmieniona zgodnie z oczekiwaniami. Ale z obsługą zdarzeń jQuery API .change() zdarzenie uruchamia się tylko przy pierwszej zmianie wartości. Wszelkie zmiany wartości po tym są ignorowane. Wydaje mi się to niewłaściwe, ale z pewnością nie może to być niedopatrzenie jQuery, prawda?

Czy ktoś napotkał ten sam problem i czy masz obejście lub rozwiązanie problemu innego niż opisane powyżej?

+1

Czy używasz IE przez przypadek? – spig

+0

Generalnie unikam IE jak ognia. LOL Ale poważnie rozwijam się w Fireboksie, dzięki czemu mogę korzystać z Firebuga i jego niesamowitości, a następnie testować w IE, Chrome i Safari. Dlaczego pytasz? Metoda .live() (odpowiedź poniżej) rozwiązała dla mnie ten problem. – gurun8

+0

@ gurun8 Dlaczego parametr uploadFile() nie ma jakiegoś parametru? Chcę wywołać metodę ASP.NET MVC w ten sposób, ale javascript powinien wysłać plik, który chce przesłać jako parametr –

Odpowiedz

81

to ajax uploader odświeżający twój element wejściowy? jeśli tak, powinieneś rozważyć użycie metody .live().

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

zmiana:

z jQuery 1.7+ należy użyć teraz .on()

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

Dzięki za aktualizację –

+5

działa to dla IE ???? –

+1

Wiązanie zdarzenia zmiany w Jquery nie będzie działać w IE <9, zamiast tego użyj natywnego onchange. – Sanjeev

10

nie mogłem dostać IE8 + do pracy poprzez dodanie obsługi zdarzenia jQuery typu pliku wejściowego . Musiałem iść starej szkoły i dodać atrybut onchange="" do znacznika wejściowego:

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

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

Jak jQuery 1.7, metoda .live() jest przestarzała. Użyj .on(), aby dołączyć programy obsługi zdarzeń. Użytkownicy starszych wersji jQuery powinni używać .delegate() zamiast .live(). Patrz: http://api.jquery.com/on/

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

Dobre złapanie deprecjacji live(), ale pokazany formularz nie działa. Formularz pokazany przez @LuisMelgrati działa. I rzeczywiście, strona, którą łączysz, daje drugą formę zastępującą tę funkcję. – PhiLho

+0

Dzięki @PhiLho, właśnie znalazłem link, który miałem na myśli, to .live() not .on() –

Powiązane problemy