Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery检查全部&;启用不在一起工作的字段_Javascript_Jquery - Fatal编程技术网

Javascript 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

我有下面的jQuery脚本,用于管理输入的大型树状视图,并能够启用/禁用某些输入。当一行被启用时,它的文本框应该被启用,反之亦然

更新(工作)

这是我的剧本:

<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'); 
 });