IE проблема: взаимодействие клавиатуры с флажком - PullRequest
0 голосов
/ 29 мая 2009

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

Обработчик события флажка определяется следующей функцией:

function getCheckboxCallback() {
  return function () {
    var parentRow = getParentRow(this);
    if (!parentRow) {
      return;  // No parent row found; abort
    }

    // Adjust the appearance of the row
    setSelected(parentRow, this.checked);

    // Count the number of selected table rows, and disable the submit
    // button whenever no rows are selected
    enforceInvariants();

    return true;
  };
}

В другом месте в том же модуле флажки имеют обработчики событий:

checkbox.onchange = getCheckboxCallback();
checkbox.onclick = getCheckboxCallback();  // alleged IE fix

Я работаю в Windows XP, и все отлично работает как в Firefox 3, так и в Opera 9. Однако IE 7 плохо обрабатывает взаимодействие с клавиатурой (взаимодействие с мышью работает нормально).

Проблема в том, что, если у флажка есть фокус, и я нажимаю пробел, флажок не проверяется - вместо этого он наполовину проверяется (у него такой же затененный вид, какой он получал бы сразу после размытия). Я должен нажать пробел во второй раз, чтобы на самом деле установить флажок. Аналогично, для снятия отметки требуется два нажатия клавиш. Как ни странно, если я удержу пробел в течение нескольких минут, то одно нажатие будет работать, как и ожидалось.

Может кто-нибудь объяснить, что здесь происходит? Есть ли что-то, что я делаю неправильно в коде JavaScript, который вызывает такое поведение? Как я могу это исправить?

1 Ответ

1 голос
/ 29 мая 2009

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

Вы можете попробовать использовать событие только для IE "onpropertychange".

Ссылка: http://lhorie.blogspot.com/2007/04/fixing-ie7-onchange-bug-on-checkboxes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...