2015-04-22 34 views
3

內的所有複選框我有一些動態生成的表,每看有點像這一點,與動態IDJQuery的 - 禁用不一樣的表

<table class="innerDatTable" id="dynamically-generated'> 
    <caption><h2>Project #</h2></caption> 
    <thead> 
     <tr> 
      <th></th> 
      <th>SubProject Name</th> 
      <th>Date Completed</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td><input type="checkbox" /></td> 
      <td><span>SubProjectName</span></td> 
      <td><span>Date</span></td> 
     </tr> 
    </tbody> 
</table> 

當任何一個複選框用戶點擊表內,應禁用所有其他複選框,其中而不是在此表內(因此它們只能從同一項目中選擇子項目)。反之亦然,如果用戶取消選中表格中的所有框,則所有複選框將再次可用。 我想這樣的事情...

if ($('table input:checked').length > 0) { 
    checked = $(this).prop('checked'); 
    ($('table input[type=checkbox]').attr('id').not($(this).attr('id'))) 
    .prop('disabled', checked); 
} 

這裏的邏輯是,如果任何框表內檢查,禁用所有不具有相同的ID作爲該表(再次,這些ID其他複選框未提前知道)。我主要遵循這個question的答案,並試圖將其改變爲我的需要,但我無法獲得所需的效果(或對此有任何影響)。

我是否需要將所有其他表ID放入數組中,並在循環中禁用它們中的每一個?有人能指出我在語法方面的正確方向,還是更好的邏輯?

+0

禁用輸入不會取消選中它,只是讓您知道。 – Nit

回答

2

首先找到所有複選框並添加事件處理程序。
然後找到離改變的複選框最近的表格,然後找到該表格內的所有複選框。

現在我們有了這一點,我們可以過濾掉的複選框當前表,並讓所有的休息,所以如果當前表中的任何複選框被選中,我們可以禁用它們,我們可以檢查與​​上集合。

var boxes = $('table input[type="checkbox"]') 

boxes.on('change', function() { 
    var table = $(this).closest('table'), 
     inputs = table.find('input[type="checkbox"]'); 

    boxes.not(inputs).prop('disabled', inputs.is(':checked')); 
}); 
0

當我必須處理DOM中的設置和/或不安定元素時,我通常會爲活動項目(例如「活動」)指定一個特定的類。這樣,我可以遍歷DOM,取消設置非活動元素,而不必擔心當前的「活動」元素。

換句話說,你會想要做類似的信息(僞):

$("parent element").find("checkbox elements").not(".active").setInactive() 

這種方法確實需要代碼在DOM中的特定元素設置未設置類。例如,如果將活動類添加到單擊的元素,但不刪除它,則此方法將不起作用(因爲會有多個活動元素)。

當然,您需要確保您使用正確的功能來取消設置不活動的複選框。 This SO問題應該引導你朝着正確的方向前進......