2013-02-21 2 views
0

У меня есть сценарий, который должен выбрать флажок для ввода всех потомков, когда установлен флажок предка.Почему attr() не обновляет HTML при вызове во второй раз?

Смотрите здесь: http://jsfiddle.net/zJPfR/

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

Если я ошибаюсь, сообщите мне.

Дарий

 $('.poSelect').click(function() { 
     var expandBox = $(this).parents('.pohelpTbl').next('.expandBox'); 
     var receipts = expandBox.find('input[type="checkbox"]'); 

     if ($(this).is(':checked')) { 
      var status = true; 
     } else { 
      var status = false; 
     } 

     $(receipts).each(function (i) { 
      var cb = $(this); 
      cb.attr("checked",status);   
     }); 
    }); 
+0

Вам не нужен 'if' /' else' или 'каждый()'; просто используйте: ['receipts.prop ('checked', this.checked);'] (http://jsfiddle.net/davidThomas/zJPfR/5/) –

+0

Понял! Интересно, почему я был проголосован ... – Darius

ответ

1

Это должно быть

$('.poSelect').click(function() { 
    var receipts = $(this).closest('.pohelpTbl').next('.expandBox').find(':checkbox'); 

    receipts.prop('checked', this.checked); 
}); 

Там нет необходимости перебирать каждый из receipts элементов, вы можете позвоните по телефону .prop() прямо на номер receipts.

Демо: Fiddle

+0

Почему вы используете jQuery для проверки свойства 'checked'? Просто используйте 'this.checked'. Он возвращает Boolean все отдельно. –

+0

@DavidThomas Не знал этого, спасибо. –

+0

Это очень интересно, Арун. Мне действительно нравится этот метод намного лучше, предполагая, что в этом цикле ничего не нужно делать. – Darius

4

JQuery-х .attr использует только начальные атрибуты. Используйте .prop вместо .attr, чтобы изменить текущий DOM.
cb.attr("checked",status); =>cb.prop("checked",status);

+1

А, я этого не знал. Это прекрасно работает, Мусман. Спасибо! – Darius

0

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

изменение от этого:

var cb = $(this); 
cb.attr("checked",status); 

к этому:

var cb = $(this); 
if (status){ 
    cb.attr("checked","checked"); 
} 
else{ 
    cb.removeAttr("checked"); 
} 
Смежные вопросы