jQuery странное поведение на click () от click () - PullRequest
1 голос
/ 13 августа 2010

Я столкнулся со странным поведением в jQuery 1.4 с событием click. Идея состоит в том, чтобы щелкнуть по раскрывающемуся списку (change()), который затем дважды инвертирует коллекцию флажков, используя их функцию click().
Если мне нужно сделать это, то потому, что флажки click на обновляют другие поля, поэтому я подумал, что вместо инвертирования атрибута флажков checked давайте просто дважды вызовем щелчок на всех флажках.

Хотя все флажки правильно инвертированы дважды, .length, который я использую для функции click, теряет правильный счет во время операции и каждый раз возвращает 1 больше, чем следовало бы.

Чтобы прояснить это, вот идея кода:

//The 'click' function
$('input:checkbox').click(function(){
    $(this).parent().find("input:checkbox:checked").length;//<- this one's not returning the right count
    //some code updating other fields thanks to the 'length' of the checkboxes
});

//The dropdown function
$('select.dropdown').change(function(){
    $(this).parent().find("input:checkbox").click();//Invert the first time
    $(this).parent().find("input:checkbox").click();//Invert a second time
});

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

Вот 2 сценария, которые еще глубже объясняют проблему, с которой я сталкиваюсь:

  1. Если я выберу что-то из выпадающего списка (длина не указана), а затем сниму флажок и перепроверяю флажок, счет будет правильным.
  2. Если я добавлю код ошибки в конце функции click(), он будет работать нормально, за исключением сообщения об ошибке в консоли отладчика javascript. Кстати, я не могу сохранить это решение, потому что в этом случае происходит сбой другой функции.


Ура,
Николя.

Ответы [ 2 ]

2 голосов
/ 13 августа 2010

Если вы хотите инвертировать состояние checked флажка, вы можете сделать это:

$(this).parent().find("input:checkbox").attr('checked', function(i, sel) {
    return !this.checked;
});

Обратите внимание, что вызов .find("input:checkbox").attr(... инвертирует все флажки. Так что, если вы позвоните дважды, они будут перевернуты дважды, создавая впечатление, что ничего не произошло.


EDIT:

Если дело в том, что вы просто хотите запустить обработчик, вы можете использовать .triggerHandler(), который вызовет click без запуска поведения элемента по умолчанию.

$(this).parent().find("input:checkbox").triggerHandler('click');

http://api.jquery.com/triggerhandler/

1 голос
/ 13 августа 2010

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

function countCheckedBoxes(theForm){
    theForm.find("input:checkbox:checked").length;//<- this one's not returning the right count 
    //some code updating other fields thanks to the 'length' of the checkboxes 
}); 

//The 'click' function 
$('input:checkbox').click(function(){ 
    countCheckedBoxes($(this.form));
}); 

//The dropdown function 
$('select.dropdown').change(function(){ 
    countCheckedBoxes($(this.form));
}); 

Тогда вы не полагаетесь на обработку событий щелчка вложенным способом (что, я считаю,проблема), и вы запускаете функцию countCheckedBoxes () явно, вместо того, чтобы полагаться на побочный эффект отмечаемых флажков.

...