简体   繁体   中英

check/uncheck parent checkbox if all uncheck/check event on change with jQuery

I have this tree list, I am checking all childrens checkboxes if parent is checked and so on, everything works great, but I am having an issue with the last ul Item 03 checkboxes , need to check if all checkboxes are checked then parent checkbox should be checked and the viceversa if the all checkboxes are unchecked then uncheck parent check, something like the toggle the parent checkbox based on all check/all unchecked.

I have a jsfiddle http://jsfiddle.net/g40e3nyL/

and this is how the js looks like:

function checks() {
                $('input[type="checkbox"]').on('change', function(){
                    var checkboxes = $(this).parent().next('ul').find('input[type="checkbox"]');

                    var count_checked = checkboxes.filter(":checked").length; 
                    if (count_checked == 0)  {
                        console.log('All checked'); //find parent and uncheck box
                    } else if(count_checked != checkboxes.length) {
                        console.log('');
                    } else {
                        console.log('all childrens unselected'); //find parent and uncheck box
                    }

                    if ($(this)[0].checked == true) {
                        checkboxes.each(function(){
                            $(this).prop('checked', true).attr('checked', 'checked');
                        });
                    } else {
                        checkboxes.each(function(){
                            $(this).prop('checked', false).removeAttr('checked');
                        });
                    };


                });
            } checks();

This is how the html markup looks like:

    <ul>
                <li>
                    item 01<label for=""><input type="checkbox" checked="checked" /></label>
                    <ul>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li>
                    item 02<label for=""><input type="checkbox" checked="checked" /></label>
                    <ul>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li>
                    item 03<label for=""><input type="checkbox" checked="checked" /></label>
                    <ul>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                        <li>
                            Item 02<label for=""><input type="checkbox" checked="checked" /></label>
                            <ul>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                    <ul>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                        <li>
                                            Item 04<label for=""><input type="checkbox" checked="checked" /></label>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                                <li>
                                    Item 03<label for=""><input type="checkbox" checked="checked" /></label>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>

Something like this?

    function checks() {
        $('input[type="checkbox"]').on('change', function(){
            var checkboxes = $(this).parent().next('ul').find('input[type="checkbox"]');
            var siblings = $(this).closest('li').siblings().andSelf();
            var siblings_checked_count = siblings.find('> label :checked').size();
            var parent_checkbox = $(this).closest('ul').prev().find(':checkbox');

            console.log(siblings, siblings_checked_count);

            var count_checked = checkboxes.filter(":checked").length; 
            if (count_checked == 0)  {
                console.log('All checked'); //find parent and uncheck box
            } else if(count_checked != checkboxes.length) {
                console.log('');
            } else {
                console.log('all childrens unselected'); //find parent and uncheck box
            }

            if ($(this)[0].checked == true) {
                checkboxes.each(function(){
                    $(this).prop('checked', true).attr('checked', 'checked');
                });
            } else {
                checkboxes.each(function(){
                    $(this).prop('checked', false).removeAttr('checked');
                });
            };

            if (!siblings_checked_count)  {
                parent_checkbox.prop('checked', false).removeAttr('checked');
            }
            else if (siblings_checked_count === siblings.size()) {
                parent_checkbox.prop('checked', true).attr('checked', 'checked');
            }
        });
    }
    checks();

I forked your jsfiddle at http://jsfiddle.net/m8sr515L/ .

Perhaps not the most elegant solution, but it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM