Подтвердить что ты не робот

В jQuery, почему программный запуск "click()" на флажке не сразу проверяет его?

Обновление: это относится только к jQuery 1.8 и ниже. Это было исправлено в jQuery 1.9.

Вот мой минимальный пример jsfiddle: http://jsfiddle.net/8fuEJ/. Я использую Google Chrome, если это имеет значение.

У меня есть флажок:

<input type="checkbox" id="wtf">

И у меня есть обработчик событий jquery:

$('#wtf').click(function(ev) { alert(this.checked); });

До сих пор так хорошо. Когда я нажимаю этот флажок, я сначала вижу галочку, а затем предупреждение "true" (в этом порядке). Когда я снова нажимаю на него, я вижу, что галочка исчезает, а затем предупреждение "false".

Проблема возникает, когда я программно запускаю событие click. Вот так:

$('#wtf').click(function(ev) { alert(this.checked); });
$('#wtf').click();

В этом случае сначала я вижу предупреждение "false" (с галочкой еще не видно), а затем после отклонения предупреждения появляется галочка.

Почему здесь разница в порядке?

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

$('#wtf').change(function(ev) { alert(this.checked); });
$('#wtf').click();

Здесь я вижу галочку, а затем предупреждение "true".

4b9b3361

Ответ 1

Здесь действуют три типа действий:

  • Вручную нажмите на него, изменив состояние. Это все, что он делает сам по себе; затем запускается триггер, потому что он понимает, что он был нажат. Это вопрос поведения браузера перед поведением сценариев.
  • Вызов события Click() вызывает событие javascript. jQuery приоритизирует предоставленную вами функцию, так как это может очень хорошо отменить этот клик или выполнить некоторые другие действия. После этого javascript изменяет статус флажка.
  • Наконец, событие Change() воспроизводит щелчок вручную, сообщая браузеру щелкнуть его. Это означает, что элемент изменяется браузером, который, в свою очередь, вызывает ваше инициированное событие.

По существу разница заключается в том, что Click() является прямым вызовом javascript. Он может делать то, что другие не могут, например, отменять изменение и делать всевозможные другие сумасшедшие вещи, поэтому он задерживает изменение состояния столько, сколько может.

Ответ 2

Событие клика срабатывает перед действием по умолчанию. Это позволяет предотвратить действие по умолчанию, возвращая false из обработчика.

В вашем примере это означает, что вы предупреждаете старое значение, поскольку действие по умолчанию для изменения состояния флажка еще не произошло.