2015-04-22 30 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问题应该引导你朝着正确的方向前进......