Является ли это основным недоразумением события щелчка по умолчанию на входах флажков или ошибочного кода? - PullRequest
5 голосов
/ 15 сентября 2011

При привязке к событию click для ввода флажка флажок уже устанавливается к тому времени, когда запускается мой обработчик событий, и, что более странно, переключение изменяется после запуска моего обработчика событий, если я укажу event.preventDefault ();

<input id="foo" type="checkbox"/>

function clicked(evt) {
   alert(document.getElementById('foo').checked);
   evt.preventDefault();
}

document.getElementById('foo').addEventListener('click',clicked);

[проверено в Chrome и Firefox]

JSFiddle для этого кода

Уведомление ответит «истина» (или обратное состояние флажка предварительного щелчка). После того, как вы отклоните предупреждение, флажок переключается обратно.

Итак, я думаю, что вопросы,

Какое фактическое событие по умолчанию было предотвращено? Я ошибаюсь, полагая, что мой обработчик событий должен быть запущен до изменения состояния? Есть ли способ законно перехватить щелчок флажка?

И почему в мире warnDefault вызывает повторное переключение флажка?

1 Ответ

8 голосов
/ 15 сентября 2011

Фактическое событие по умолчанию, которое предотвращается - это событие click. Возможно, недоразумение возникает из-за того, что вы думаете о событии как о срабатывании после того, как фактический щелчок был полностью обработан (т. Е. Установлен флажок), тогда как в действительности модель события предусматривает, что обработчик запускает , а событие обрабатывается.

Если это поможет, другая модель, которую я нашел полезной при объяснении того, как все это работает, - это модель транзакций базы данных: представьте, что ваш обработчик событий вызывается как часть транзакции, внутри которой флажок уже установлен.

  • Если вы прочитаете состояние флажка, вы обнаружите, что он переключен («запись» отправлена ​​в базу данных).
  • Однако вы все равно можете решить откатить транзакцию (в этом случае запись отменяется, а флажок возвращается к исходному значению).
...