Обработчики кликов jQuery не всегда работают в IE 7/8, используя версию 1.5.

Я определил некоторые обработчики событий щелчка следующим образом:

$(document).ready(function () {
  /*
  * Since the "Start Upload" button is available, we don't need to worry about starting the 
  * upload when the user clicks "Update". But we need to make sure to display an error message
  * if there are files in the uploader that have not been uploaded yet.
  */
  $('#myAccount p.buttons input[alt="Update"]').click(function (event) {

    // check if there are files in the uploader
    if (uploader.files.length > 0) {

        // if there are files that have not been uploaded yet, we need to show an error message
        if (uploader.total.uploaded != uploader.files.length) {

            // if the error message hasn't been created yet, create it
            // else, it'll already be visible so we don't need to do anything
            if ($('#upload_error').length == 0) {
                $('<p id="upload_error">Error!</p>').insertAfter('#myAccount p.buttons input[alt="Cancel"]');
            }
            event.preventDefault(); // stop the click event
        }
    }
    // continue click event as normal
  });
});

... и ...

// if the cancel button is clicked, then remove the files from the uploader
$('#myAccount p.buttons input[alt="Cancel"]').click(function (event) {
    uploader.splice(0, uploader.files.length);
    // continue click event as normal
});

Оба прекрасно работают в Firefox, но в IE8 и IE7 (режим совместимости) они не работают все время.

Чтобы быть более конкретным, этот «загрузчик» связан с загрузчиком файлов Plupload. По сути, у меня есть этот загрузчик в форме. Форма отправляется нормально, и вышеуказанные обработчики кликов работают нормально, если я вообще не касаюсь загрузчика.

Однако в следующем случае вышеуказанные обработчики кликов не работают: я ставлю файлы в очередь и позволяю загрузчику делать свое дело, поэтому все файлы были загружены; теперь я нажимаю «Отправить» в форме, и ничего не происходит, но я ожидаю, что форма будет отправлена. Каждый раз, когда я взаимодействую с загрузчиком, обработчики событий щелчка не работают.

Я надеюсь, что мои комментарии прояснят мои намерения. Есть идеи, почему это не работает в IE 7/8? Что я делаю неправильно? Обрабатывается ли event.preventDefault() по-другому в IE?

Спасибо.


person Hristo    schedule 14.02.2011    source источник
comment
Какую версию jQuery вы используете?   -  person Pointy    schedule 14.02.2011
comment
Извини за это. Я использую новейшую версию v1.5, но я уверен, что она не работает с предыдущей версией v1.4.2.   -  person Hristo    schedule 14.02.2011
comment
Пробовали отлаживать с помощью alert(hello)? Эти выборки jQuery выглядят сложными, я бы попробовал ввести идентификатор и попробовать $(#inputsid).... лично. Возможно, в IE не удается найти правильный элемент.   -  person Phil    schedule 14.02.2011
comment
Да, я пробовал с предупреждениями... помещая предупреждение в самую первую строку, а самая последняя строка всегда выводит предупреждение, но щелчка, похоже, не происходит. Кроме того, использование точного идентификатора не сработало.   -  person Hristo    schedule 14.02.2011


Ответы (2)


Попробуй это:

if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; }

проверьте для preventDefault перед его использованием.

При этом с jQuery вам нужно только return false;, и он все сделает за вас.

person Andrew Jackman    schedule 14.02.2011
comment
Что это делает? Если оператор if оценивается как истина, то вы делаете event.preventDefault()? Какая здесь логика? - person Hristo; 14.02.2011
comment
Проверьте, существует ли event.preventDefault, прежде чем пытаться его использовать. Не все браузеры поддерживают его, поэтому вам необходимо протестировать его перед выполнением. Вот ссылка, чтобы узнать больше: openjs.com/articles/prevent_default_action - person Andrew Jackman; 14.02.2011
comment
... но не будет ли он if (event.preventDefault) выполняться автоматически, если он существует? Кроме того, если его не существует, разве событие не завершится полностью? - person Hristo; 14.02.2011
comment
Нет, это не выполнение функции, просто ссылка на объект. Если он не существует, результатом будет null или undefined (оба будут интерпретированы как ложные), а если он существует, он вернет строку, указывающую, что представляет собой объект (что будет истинным). - person Andrew Jackman; 14.02.2011
comment
понял... спасибо за объяснение, но это все равно не работает :/ - person Hristo; 14.02.2011
comment
Это уже делается реализацией preventDefault в jQuery. - person Vadim; 14.02.2011

Я только что переключился на среду выполнения Flash. Кажется, сейчас все работает нормально.

person Hristo    schedule 16.02.2011