У меня есть форма для загрузки файлов, и она должна запустить отправление после выбора файла.
На FireFox/Chrome это подходит и отправляет форму после выбора файла, но я не могу сделать этого на Internet Explorer.
Уже попробованный click/propertychange, но ничего не происходит. Некоторый код я уже попробовал:
$("#attach").attr("onChange", "alert('I changed')");
$("#attach").live($.browser.msie? 'propertychange': 'change', function(e) { ... });
Этот входной файл создается на лету; из-за этого я использую .live()
связывать событие.
Какие-либо предложения?
Отформатируйте его так:
$("#attach").change(function() {
alert('I Changed');
});
Обновление: Ответив на другой вопрос ранее, мы поняли, что это исправлено как часть события jQuery 1.4.2, перезапись , просто обновите его до последней версии, чтобы решить проблему события change
с
в IE.
У меня это всегда работало в IE6 и IE7.
$('#id-of-input-type-file').change(function(){});
Я могу подтвердить, по крайней мере, что это работает только после события размытия, аналогично радио и флажку в IE. Мне, вероятно, придется добавить какой-то визуальный элемент, чтобы пользователь мог щелкнуть и сообщить мне, когда он выбрал свой файл.
хромой.
Скорее всего, это проблема с состоянием гонки с полями ввода в IE. При использовании setTimeout выполняемая функция зарегистрирует, что произошло изменение. Когда код пользовательского интерфейса выполняется в onChangeEvent, это событие еще не сработало, как кажется в IE.
Я решил аналогичную ситуацию, сделав следующее внутри обработчика изменений:
if (jQuery.browser.msie) { setTimeout(DoSomeUIChange, 0); } else { DoSomeUIChange(); }
DoSomeUIChange выполняется после текущего кода в очереди событий и таким образом устраняет условие гонки.
Я знаю, что это запоздало на несколько месяцев, но я только что столкнулся с точно таким же поведением в IE7; во всех других браузерах событие изменения для ввода файлов происходит после выбора файла. В IE7 это происходит только при повторном выборе файла или при размытии.
Вот как я это исправил:
var $input = $('#your-file-input-element');
var someFunction = function()
{
// what you actually want to do
};
if ($.browser.msie)
{
// IE suspends timeouts until after the file dialog closes
$input.click(function(event)
{
setTimeout(function()
{
if($input.val().length > 0) {
someFunction();
}
}, 0);
});
}
else
{
// All other browsers behave
$input.change(someFunction);
}
Технически вы можете/должны отфильтровать условие взлома только для IE7, поскольку IE8 ведет себя правильно при событии изменения, но он также ведет себя так же, как IE7, приостанавливая таймауты, пока виден хром, связанный с браузером (я полагаю, он считает это блокировкой ввода/вывода), поэтому все работает как есть.