AngularJS+JQuery 做的一个复选框树形结构

<html ng-app="com.ngbook.demo" class="ng-scope">
<head>
    <meta name="description" content="ng trrview example">
    <link href="//cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <script src="jquery.min.js"></script>
    <link href="bootstrap.min.css" rel="stylesheet" type="text/css" />
        <meta charset="utf-8">
    <title>JS Bin</title>
    <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <style id="jsbin-css">
        ul{
            list-style: none;
        }
        .text-field{
            cursor: pointer;
        }
        .check-box{
            width: 24px;
            height: 18px;
            border-radius: 8px;
        }
    </style>
</head>
<body>
<div ng-controller="DemoController as demo" class="container">


    <div class="row">
        <h2>Tree view</h2>
        <tree-view tree-data="demo.tree" text-field="name" value-field='id'
                   item-clicked="demo.itemClicked($item)" item-checked-changed="demo.itemCheckedChanged($item)" can-checked="true" ></tree-view>
    </div>

<!--    <div class="row">
        <h2>Item selected</h2>
        <pre>{{demo.selectedItem | json}}</pre>
    </div>-->
    <script type="text/ng-template" id="/treeView.html">
        <ul class="tree-view">
            <li ng-repeat="item in treeData" ng-include="itemTemplateUrl || '/treeItem.html'" ></li>
        </ul>
    </script>
    <script type="text/ng-template" id="/treeItem.html">
        <i ng-click="itemExpended(item, $event);" class="{{getItemIcon(item)}}"></i>

        <input id="{{item.id}},{{item.pid}}"  type="checkbox" ng-model="item.$$isChecked" class="check-box" ng-if="canChecked">


        <span class='text-field' ng-click="warpCallback('itemClicked', item, $event);" >{{item[textField]}}</span>
        <ul ng-if="!isLeaf(item)"
            ng-show="item.$$isExpend">
            <li ng-repeat="item in item.children" ng-include="itemTemplateUrl || '/treeItem.html'">
            </li>
        </ul>
    </script>

</div>
<script>try     {angular.module("com.ngbook.demo", [])
        .controller("DemoController", ['$http',function($http){
            var vm = this;
            vm.tree = [
                {
                    "id":"1",
                    "pid":"0",
                    "name":"家用电器",
                    "children":[
                        {
                            "id":"4",
                            "pid":"1",
                            "name":"大家电",
                            "children":[
                                {
                                    "id":"7",
                                    "pid":"4",
                                    "name":"空调",
                                    "children":[
                                        {
                                            "id":"15",
                                            "pid":"7",
                                            "name":"海尔空调"
                                        },
                                        {
                                            "id":"16",
                                            "pid":"7",
                                            "name":"美的空调"
                                        }
                                    ]
                                },
                                {
                                    "id":"8",
                                    "pid":"4",
                                    "name":"冰箱"
                                },
                                {
                                    "id":"9",
                                    "pid":"4",
                                    "name":"洗衣机"
                                },
                                {
                                    "id":"10",
                                    "pid":"4",
                                    "name":"热水器"
                                }
                            ]
                        },
                        {
                            "id":"5",
                            "pid":"1",
                            "name":"生活电器",
                            "children":[
                                {
                                    "id":"19",
                                    "pid":"5",
                                    "name":"加湿器"
                                },
                                {
                                    "id":"20",
                                    "pid":"5",
                                    "name":"电熨斗"
                                }
                            ]
                        }
                    ]
                },
                {
                    "id":"2",
                    "pid":"0",
                    "name":"服饰",
                    "children":[
                        {
                            "id":"13",
                            "pid":"2",
                            "name":"男装"
                        },
                        {
                            "id":"14",
                            "pid":"2",
                            "name":"女装"
                        }
                    ]
                },
                {
                    "id":"3",
                    "pid":"0",
                    "name":"化妆",
                    "children":[
                        {
                            "id":"11",
                            "pid":"3",
                            "name":"面部护理"
                        },
                        {
                            "id":"12",
                            "pid":"3",
                            "name":"口腔护理"
                        }
                    ]
                }
            ];


        }])
        .directive('treeView',[function(){

            return {
                restrict: 'E',
                templateUrl: '/treeView.html',
                scope: {
                    treeData: '=',
                    canChecked: '=',
                    textField: '@',
                    itemClicked: '&',
                    itemCheckedChanged: '&',
                    itemTemplateUrl: '@'
                },
                controller:['$scope', function($scope){
                    $scope.itemExpended = function(item, $event){
                        item.$$isExpend = ! item.$$isExpend;
                        $event.stopPropagation();
                    };

                    $scope.getItemIcon = function(item){
                        var isLeaf = $scope.isLeaf(item);

                        if(isLeaf){
                            return 'fa fa-leaf';
                        }

                        return item.$$isExpend ? 'fa fa-minus': 'fa fa-plus';
                    };

                    $scope.isLeaf = function(item){
                        return !item.children || !item.children.length;
                    };

                    $scope.chk = function(callback , item){
                        var itemId = item.id;

                    };

                    $scope.warpCallback = function(callback, item, $event){
                        ($scope[callback] || angular.noop)({
                            $item:item,
                            $event:$event
                        });
                    };
                }]
            };
        }]);
} catch (error) { throw error; }

//# sourceURL=vefuqu.js
</script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script  type="text/javascript">
    // Apparently click is better chan change? Cuz IE?
   $(function(){
       // Apparently click is better chan change? Cuz IE?
       $('input[type="checkbox"]').change(function() {

           var checked = $(this).prop("checked"),
                   container = $(this).parent(),
                   siblings = container.siblings();

           container.find('input[type="checkbox"]').prop({
               indeterminate: false,
               checked: checked
           });

           function checkSiblings(el) {

               var parent = el.parent().parent(),
                       all = true;

               el.siblings().each(function() {
                   return all = ($(this).children('input[type="checkbox"]').prop("checked") === checked);
               });

               if (all && checked) {

                   parent.children('input[type="checkbox"]').prop({
                       indeterminate: false,
                       checked: checked
                   });

                   checkSiblings(parent);

               } else if (all && !checked) {

                   parent.children('input[type="checkbox"]').prop("checked", checked);
                   parent.children('input[type="checkbox"]').prop("indeterminate", (parent.find('input[type="checkbox"]:checked').length > 0));
                   checkSiblings(parent);

               } else {

                   el.parents("li").children('input[type="checkbox"]').prop({
                       indeterminate: true,
                       checked: false
                   });

               }

           }

           checkSiblings(container);
       });
   });

</script>


</body>

</html>

首先是利用angularJS 的递归 然后加上Jquery实现复选框的全选 可以摘下来试试

然后 感谢网络上那些 前辈 大牛们的分享  谢谢

然后 感谢网络上那些 前辈 大牛们的分享  谢谢
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以为您提供一个基本的HTML+CSS+jQuery示例实现,如下所示: ```html <!DOCTYPE html> <html> <head> <title>复选框操作示例</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <style type="text/css"> .container { margin: 20px; } .checkbox-group { margin-bottom: 10px; } .checkbox-group label { margin-right: 10px; } .button-group { margin-top: 10px; } </style> </head> <body> <div class="container"> <div class="checkbox-group"> <label><input type="checkbox" name="checkbox[]" value="1">选项1</label> <label><input type="checkbox" name="checkbox[]" value="2">选项2</label> <label><input type="checkbox" name="checkbox[]" value="3">选项3</label> <label><input type="checkbox" name="checkbox[]" value="4">选项4</label> <label><input type="checkbox" name="checkbox[]" value="5">选项5</label> </div> <div class="button-group"> <button id="select-all">全选</button> <button id="select-inverse">反选</button> <button id="select-none">全不选</button> </div> </div> <script type="text/javascript"> $(function() { // 全选 $('#select-all').click(function() { $('input[type="checkbox"]').prop('checked', true); }); // 反选 $('#select-inverse').click(function() { $('input[type="checkbox"]').each(function() { $(this).prop('checked', !$(this).prop('checked')); }); }); // 全不选 $('#select-none').click(function() { $('input[type="checkbox"]').prop('checked', false); }); }); </script> </body> </html> ``` 在这个示例中,我们首先定义了一个包含5个复选框的`checkbox-group`,并且定义了一个包含三个按钮的`button-group`。然后,我们使用jQuery来实现三个操作: 1. 全选:当用户点击`select-all`按钮时,我们使用`prop`方法将所有复选框的`checked`属性设置为`true`,从而实现全选的功能。 2. 反选:当用户点击`select-inverse`按钮时,我们使用`each`方法遍历所有复选框,并对每个复选框的`checked`属性取反,从而实现反选的功能。 3. 全不选:当用户点击`select-none`按钮时,我们使用`prop`方法将所有复选框的`checked`属性设置为`false`,从而实现全不选的功能。 希望这个示例能够帮助您实现您的需求!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值