JQuery: событие изменения для ввода файла на IE

У меня есть форма для загрузки файлов, и она должна запустить отправление после выбора файла.

На FireFox/Chrome это подходит и отправляет форму после выбора файла, но я не могу сделать этого на Internet Explorer.

Уже попробованный click/propertychange, но ничего не происходит. Некоторый код я уже попробовал:

$("#attach").attr("onChange", "alert('I changed')");
$("#attach").live($.browser.msie? 'propertychange': 'change', function(e) { ... });

Этот входной файл создается на лету; из-за этого я использую .live() связывать событие.

Какие-либо предложения?

36
задан Andrew Myers 15 April 2019 в 17:35
поделиться

5 ответов

Отформатируйте его так:

$("#attach").change(function() { 
  alert('I Changed');
});

Обновление: Ответив на другой вопрос ранее, мы поняли, что это исправлено как часть события jQuery 1.4.2, перезапись , просто обновите его до последней версии, чтобы решить проблему события change с в IE.

10
ответ дан 27 November 2019 в 05:39
поделиться

У меня это всегда работало в IE6 и IE7.

$('#id-of-input-type-file').change(function(){});
2
ответ дан 27 November 2019 в 05:39
поделиться

Я могу подтвердить, по крайней мере, что это работает только после события размытия, аналогично радио и флажку в IE. Мне, вероятно, придется добавить какой-то визуальный элемент, чтобы пользователь мог щелкнуть и сообщить мне, когда он выбрал свой файл.

хромой.

0
ответ дан 27 November 2019 в 05:39
поделиться

Скорее всего, это проблема с состоянием гонки с полями ввода в IE. При использовании setTimeout выполняемая функция зарегистрирует, что произошло изменение. Когда код пользовательского интерфейса выполняется в onChangeEvent, это событие еще не сработало, как кажется в IE.

Я решил аналогичную ситуацию, сделав следующее внутри обработчика изменений:

if (jQuery.browser.msie) { setTimeout(DoSomeUIChange, 0); } else { DoSomeUIChange(); }

DoSomeUIChange выполняется после текущего кода в очереди событий и таким образом устраняет условие гонки.

2
ответ дан 27 November 2019 в 05:39
поделиться

Я знаю, что это запоздало на несколько месяцев, но я только что столкнулся с точно таким же поведением в 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, приостанавливая таймауты, пока виден хром, связанный с браузером (я полагаю, он считает это блокировкой ввода/вывода), поэтому все работает как есть.

41
ответ дан 27 November 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: