2013-03-07 52 views
23

我找到原因了以下的jQuery /複選框的行爲問題。jQuery的ATTR(「檢查」,「檢查」)的作品只有一次

$(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'); 

} 

}); 

代碼的目的是爲工作如下: - 點擊input.select_all觸發事件 - 如果input.select_all檢查:添加屬性檢查table.sgrid-內標記爲。選擇所有複選框內容 - 如果沒有:從所有input.select項中移除'checked'屬性。

還有一種簡單的網格功能。它的工作原理。奇怪的部分是,它只能使用一次。我的意思是,你可以選擇所有的複選框並取消選擇它們。在那之後,「全選」功能停止工作。

另一個奇怪的事情是,當我檢查DOM元素與螢火蟲他們都成爲檢查=「檢查」 ATTR,因爲他們應該,但他們表現和行爲,因爲他們沒有檢查。

選擇器工作,因爲他們應該。添加/刪除ui-state-highlight的代碼部分始終工作。

字explenation的: - 是我通過得到grid.obj(基本上ID的ceratain股利)

請給我你的意見的對象。

+5

使用'.prop( '檢查',真)和.prop( '檢查',假)'代替'.attr( '檢查', '檢查')或.removeAttr'。 ATTR操縱檢查/選擇的狀態現在已經過時,在jQuery的 – codefreak 2013-03-07 08:42:41

+1

感謝,現在當你提到它,問題升級的jQuery的lib後開始。非常感謝,不知道! – PiWo 2013-03-07 08:49:12

回答

69

使用道具(「檢查」,真/假)代替removeAttr

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

使用.prop而不是.attr – codefreak 2013-03-07 08:44:47

+2

救了我頭疼得:) – NDJ 2014-01-14 11:59:37

+0

這對我來說也是有用的。謝謝。我也有一個查詢。 prop和attr有什麼區別?他們是不是都做同樣的工作? – 2016-11-18 03:17:43

0

您可以更改屬性,也將改變屬性,如果該元素是不變。一旦元素離開這個初始狀態,改變屬性不再影響屬性。確切的行爲可能因瀏覽器而異。

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