В jQuery, почему программный запуск click () на флажке не сразу проверяет его? - PullRequest
11 голосов
/ 06 октября 2011

Обновление: это относится только к 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" (в этом порядке).Когда я нажимаю на нее снова, я вижу, что галочка исчезает, а затем появляется предупреждение «ложь».

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

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

В этом случае сначала я вижу предупреждение «ложь» (с пометкой все еще не видно), , а затем после закрытия оповещения появляется пометка.

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 06 октября 2011

Здесь происходит три типа действий:

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

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

4 голосов
/ 06 октября 2011

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

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

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