2010-04-27 5 views
61

Я пытаюсь использовать jQuery 100% с помощью простого и элегантного API, но я столкнулся с несогласованностью между API и прямым HTML, что я не могу выяснить.Метод изменения jQuery для типа ввода = «файл»

У меня есть сценарий загрузки файла AJAX (который работает правильно), который я хочу запускать каждый раз при изменении значения входного файла. Вот мой рабочий код:

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

Когда я конвертировать onchange событие в реализации JQuery:

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

результат не то же самое. С атрибутом onchange функция uploadFile() вызывается в любое время, когда значение изменяется, как ожидается. Но с обработчиком события jQuery API .change() событие только срабатывает при первом изменении значения. Любое изменение значения после этого игнорируется. Это кажется мне неправильным, но, конечно, это не может быть недосмотр jQuery, верно?

Неужели кто-то еще столкнулся с одной и той же проблемой и у вас есть обходное решение или решение проблемы, отличное от того, что я описал выше?

+1

Вы используете IE случайно? – spig

+0

Я вообще избегаю IE, как чуму. LOL Но если серьезно, я развиваюсь в Firebox, чтобы я мог использовать Firebug и его удивительность, а затем тестировать в IE, Chrome и Safari. Почему вы спрашиваете? Метод .live() (ответ ниже) решил эту проблему для меня. – gurun8

+0

@ gurun8 Почему у вас нет параметра uploadFile()? Я хочу вызвать метод ASP.NET MVC, как это, но javascript должен отправить файл, который он хочет загрузить, как параметр –

ответ

81

является загружающим устройством ajax, обновляющим ваш элемент ввода? , если это так, вы должны рассмотреть возможность использования метода .live().

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

обновление:

из JQuery 1.7+ вы должны теперь использовать .он()

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

Спасибо за обновление –

+5

это работает для IE ???? –

+1

Событие смены привязки в JQuery не будет работать в IE <9, вместо этого используйте native onchange. – Sanjeev

10

Я не мог получить IE8 + работать, добавив обработчик события Jquery к типу входного файла , Я должен был пойти старую школу и добавить атрибут onchange="" к входному тегу:

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

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

По JQuery 1.7, метод .live() является устаревшим. Используйте .on() для присоединения обработчиков событий. Пользователи более старых версий jQuery должны использовать .delegate() в предпочтении .live(). Refer: http://api.jquery.com/on/

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

Хорошая уловка от устаревания live(), но форма, которую вы показываете, не работает. Форма, показанная @LuisMelgrati, работает. И действительно, страница, на которую вы ссылаетесь, дает вторую форму в качестве замены этой функции. – PhiLho

+0

Спасибо @PhiLho, только что узнал ссылку, о которой я говорил, был .live() not .on() –

Смежные вопросы