Событие jQuery.change() запускается с .click() в новых версиях?
В настоящее время я обновляю свое приложение для использования jQuery 1.6.1 (ранее использующего 1.4.4) и обнаружил, что теперь событие .click()
автоматически запускает событие .change()
.
Я создал простой пример здесь: http://jsfiddle.net/wDKPN/
Обратите внимание, если вы включите 1.4.4, функция .change()
будет не при срабатывании события .click()
. Но при переключении на 1.6 событие .change()
срабатывает при срабатывании .click()
.
Два вопроса:
-
Является ли это ошибкой? Кажется, что программный запуск .click()
не должен также запускать другие события (например, было бы неправильно также автоматически запускать .blur()
и .focus()
, чтобы помочь "имитировать" щелчок пользователя).
-
Каков правильный способ привязки события change()
, а затем запускать как событие click()
, так и change()
для этого элемента? Я просто вызываю .click()
и полагаться на то, что .change()
также будет срабатывать?
$('#myelement').change(function() {
// do some stuff
});
$('#myelement').click(); // both click and change will fire, yay!
В моем старом коде я использую этот шаблон для инициализации некоторых флажков (и их проверенных состояний и значений) после вызова ajax:
$('#myelement').change(function() {
// do some stuff including ajax work
}).click().change();
Но в 1.6.1 моя логика срабатывает дважды (один раз для .click()
и один раз для .change()
). Могу ли я полагаться только на удаление триггера .change()
и надеюсь, что jQuery продолжает вести себя таким образом в будущих версиях?
Ответы
Ответ 1
Лучший способ сделать это:
$('#myelement').bind('initCheckboxes change', function() {
// do some stuff including ajax work
}).trigger('initCheckboxes');
Чтобы сделать свой материал инициализации, вы просто привязываете к нему настраиваемое событие, которое вы запускаете при первом запуске страницы. Это никого не убьет от вас ни на какие версии.
В то время как событие change
, по-моему, будет продолжаться на всех версиях, потому что оно было так долго, и оно просто прекрасно работает.
В конце концов, это счастливая история окончания, потому что пользовательское событие initCheckboxes
будет срабатывать только один раз на загрузке страницы, а событие change
всегда будет прослушиваться и запускаться в состоянии изменения.
Ответ 2
Я бы сказал, что это была ошибка в jQuery 1.4.4. Удаление обработчиков событий jQuery и использование стандартного addEventListener
приводит к тому же результату, что и jquery 1.6.1.
http://jsfiddle.net/jruddell/wDKPN/26/
window.count = 0;
document.getElementById('mycheckbox').addEventListener('change', function() {
window.count++;
jQuery('#output').append('I fired: ' + window.count + ' times<br />');
});
document.getElementById('mycheckbox').click();
Также я бы использовал triggerHandler
для специального вызова обработчика события jQuery. Если вы хотите, чтобы модель события определяла, какие обработчики должны вызывать, используйте click
, change
и т.д.
Ответ 3
Заблокировать событие click для флажков. Событие изменения обрабатывает все.
$('#myelement').change(function() {
// do some stuff
});
$('#myelement').trigger('change');
Смотрите сами: http://jsfiddle.net/zupa/UcwdT/
(Эта демонстрация установлена в jQuery 1.8, но работает и в 1.6.)
Ответ 4
Я думаю, вы можете заставить его работать как для jQuery 1.4.4, так и для 1.6, добавив change() в обработчик кликов и затем нажав кнопку.
$('.myelement').click(function(){
$('.myelement').change();
alert($(this).val());
});
$('.myelement').trigger('click');
Посмотрите там для простого примера.