2013-03-07 25 views
23

Mam problem ze znalezieniem przyczyny następującego zachowania jquery/checkbox.jquery attr ("sprawdzone", "sprawdzone") działa tylko raz

$(this.obj + ' table.sgrid-content > thead > tr > th > input.select_all').on('click' , {grid:this} , function(event){ 

var grid = event.data.grid; 

if($(this).is(':checked')){ 

    $(grid.obj + ' table.sgrid-content > tbody > tr > td > input.select ').attr('checked','checked'); 
    $(grid.obj + ' .sgrid-content > tbody > tr > td > input.select ').parents('tr').addClass('ui-state-highlight'); 

} else { 

    $(grid.obj + ' table.sgrid-content > tbody > tr > td > input.select ').removeAttr('checked'); 
    $(grid.obj + ' table.sgrid-content > tbody > tr > td > input.select ').parents('tr').removeClass('ui-state-highlight'); 

} 

}); 

Kod jest przeznaczony do pracy w następujący sposób: - kliknij input.select_all wyzwala zdarzenie - jeśli input.select_all jest sprawdzana: dodaj atrybut sprawdził wszystkie pola oznaczone jako .Wybrać ciągu table.sgrid- treść - jeśli nie: usuń atrybut "checked" ze wszystkich elementów input.select.

Jeszcze jedna prosta funkcja siatki. I działa. Dziwne jest to, że działa tylko raz. Rozumiem przez to, że możesz zaznaczyć wszystkie pola wyboru i odznaczyć je. Po tej operacji funkcja "Wybierz wszystko" przestaje działać.

Inną dziwną rzeczą jest, że gdy sprawdzam elementy dom z firebugiem, wszystkie one są sprawdzane = 'sprawdzane' attr tak jak powinny, ale wyświetlają się i zachowują, ponieważ nie zostały sprawdzone.

Selektory działają tak, jak powinny. Część kodu z dodawaniem/usuwaniem ui-state-highlight działa cały czas.

Słowo explenation: siatki - jest to obiekt, który mijam dostać grid.obj (zasadniczo identyfikator div ceratain)

Proszę dać mi swoją opinię.

+5

użycie '.prop ('sprawdzone', true) i .prop ('sprawdzone', false)' zamiast '.attr ('sprawdzone', 'sprawdzone') lub .removeAttr'. attr do manipulowania sprawdzić/wybrane stany jest teraz przestarzałe w jQuery – codefreak

+1

dzięki, teraz gdy o tym wspomnieć, problem zaczął się po aktualizacji lib jquery. Wielkie dzięki, nie wiedziałem! – PiWo

Odpowiedz

69

Zastosowanie prop ('sprawdzone' prawda/fałsz) zamiast removeAttr

$('input[name=foo]').prop('checked', true); 
$('input[name=foo]').prop('checked', false); 
+1

użyj .prop zamiast .attr – codefreak

+2

uratował mnie też ból głowy :) – NDJ

+0

to było również przydatne dla mnie. dzięki. Mam również zapytanie. Jaka jest różnica między prop i attr? czy oboje nie wykonują tej samej pracy? –

0

Można zmienić atrybut, a także zmienić właściwość, jeśli element jest nietknięty. Gdy element opuści ten stan początkowy, zmiana atrybutu nie wpłynie już na właściwość. Dokładne zachowanie prawdopodobnie różni się w zależności od przeglądarki.

Instead of .attr('checked', 'cheked') use .prop('checked', true)

Powiązane problemy