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

Событие 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 продолжает вести себя таким образом в будущих версиях?

4b9b3361

Ответ 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');

Посмотрите там для простого примера.