Javascript JQuery检查全部&;启用不在一起工作的字段
我有下面的jQuery脚本,用于管理输入的大型树状视图,并能够启用/禁用某些输入。当一行被启用时,它的文本框应该被启用,反之亦然 更新(工作) 这是我的剧本:Javascript JQuery检查全部&;启用不在一起工作的字段,javascript,jquery,Javascript,Jquery,我有下面的jQuery脚本,用于管理输入的大型树状视图,并能够启用/禁用某些输入。当一行被启用时,它的文本框应该被启用,反之亦然 更新(工作) 这是我的剧本: <script type="text/javascript"> $(document).ready(function () { $('#cb-master').click(toggleCheckAll); $('#mappings input:checkbox[id^="cb"]').c
<script type="text/javascript">
$(document).ready(function () {
$('#cb-master').click(toggleCheckAll);
$('#mappings input:checkbox[id^="cb"]').click(checkChildren);
$('#mappings tbody tr[id^="child"] input:checkbox').change(toggleInputs);
});
function toggleCheckAll() {
var selector = $(this).is(':checked')
? '#mappings tbody input:checkbox:checked'
: '#mappings tbody input:checkbox:not(:checked)';
$(selector).each(function () {
$(this).trigger('click');
});
}
function checkChildren() {
var selector = ".child-of-" + $(this).closest('tr').attr('id');
var isChecked = $(this).is(':checked') ? ':not(:checked)' : ':checked';
$(selector).find('input:checkbox' + isChecked).each(function () {
$(this).trigger('click');
$(this).change();
});
}
function toggleInputs() {
var isChecked = $(this).attr('checked');
var inputs = $(this).closest('tr').find('input:text');
if (isChecked)
inputs.removeAttr('disabled');
else
inputs.attr('disabled', 'disabled');
}
</script>
$(文档).ready(函数(){
$(“#cb master”)。单击(toggleCheckAll);
$(“#映射输入:复选框[id^=“cb”]”)。单击(选中子项);
$('#映射tbody tr[id^=“child”]输入:复选框')。更改(切换输入);
});
函数toggleCheckAll(){
变量选择器=$(this).is(“:选中”)
?“#映射主体输入:复选框:选中”
:“#映射体输入:复选框:未(:选中)”;
$(选择器)。每个(函数(){
$(this.trigger('click');
});
}
函数checkChildren(){
var selector=“.child of-”+$(this).closest('tr').attr('id');
var isChecked=$(this).is(':checked')?':not(:checked):':checked';
$(选择器).find('input:checkbox'+isChecked)。每个(函数(){
$(this.trigger('click');
$(this.change();
});
}
函数toggleInputs(){
var isChecked=$(this.attr('checked');
变量输入=$(this).closest('tr').find('input:text');
如果(已检查)
输入。removeAttr(“禁用”);
其他的
inputs.attr('disabled','disabled');
}
这就是我的桌子的样子:
<table id="mappings">
<thead>
<tr>
<th><input type="checkbox" id="cb-master"></th>
<th>Title</th>
<th>Input</th>
</tr>
</thead>
<tbody>
<tr id="grandparent">
<td><input type="checkbox" id="cb-grandparent" /></td>
<td>Grandparent</td>
<td />
</tr>
<tr id="parent" class="child-of-grandparent">
<td><input type="checkbox" id="cb-parent" /></td>
<td>Parent</td>
<td />
</tr>
<tr id="child-1" class="child-of-parent">
<td><input type="checkbox" id="cb-child-1" /></td>
<td>Child 1</td>
<td><input type="text" /></td>
</tr>
<tr id="child-2" class="child-of-parent">
<td><input type="checkbox" id="cb-child-2" /></td>
<td>Child 2</td>
<td><input type="text" /></td>
</tr>
</tbody>
</table>
标题
输入
祖父母
父母亲
儿童1
儿童2
当我手动勾选/取消勾选每个框时,此选项起作用,但当我通过toggleCheckAll()
函数以编程方式执行此操作时,此选项不起作用。我是否也需要做些什么来以编程方式绑定此事件
此外,我在递归实现checkChildren
函数时遇到困难,因为每次尝试获取异常nodeName为null或不是对象
非常感谢您的任何意见。谢谢。查看
如果不是这样:
this.checked = isChecked;
试一试
要最初禁用所有输入文本,请首先执行以下操作:
$('input:text').each(function(){
$(this).attr('disabled', 'disabled');
});
这回答了你的问题吗?我无法对其进行测试,但我假设通过实际触发一个单击事件,它将执行其余的代码,或者不是将其绑定到单击事件,而是将其绑定到一个更改事件,这也应该有效 这仍然使我无法输入选中复选框的内容,并且会反转选择,而不是将父项的选中值一直向下推,但是,它确实解决了递归问题。@shuniar问题中是否缺少其他样式或js。我更新了JSFIDLE,除了初始化禁用代码中没有看到的输入之外,它似乎还在工作?包括所有样式和js。禁用/启用是通过mvc的html帮助程序完成的,该帮助程序确定是否应在页面呈现期间添加disabled
属性。切换仅在手动完成时有效。。我还将toggleInputs
的绑定更新为click
事件,而不是change
事件。我已更新了源代码以包含您的建议。除了输入的级联启用之外,我的一切都正常工作。我必须取消选中并重新检查它们,以启用它们的输入。一旦你选中/取消选中层叠应该可以工作,你的意思是你希望输入文本在被选中之前被初始禁用,对吗?
$('input:text').each(function(){
$(this).attr('disabled', 'disabled');
});