bootstrap-treeview.js的高级使用

本文将介绍如何利用bootstrap-treeview.js实现树形结构的高级功能,包括全选、反选以及自动选择特定节点及其所有子节点的操作。通过加载bootstrap-treeview.css,可以美化和增强树形视图的交互体验。

支持全选,反选,以及自动选择某节点以及其下面的所有子节点








{load href="__CSS__/plugins/treeview/bootstrap-treeview.css" /}

{load href="__JS__/plugins/treeview/bootstrap-treeview.js" /}
<script>


$(function(){
    $.post("__URL__/aj_buildTreesForRole",{}, function(result){
//var t='[{"text": "父节点 1","nId":4,"nodeId":4,"tags":["44"],"nodes": [{"text": "子节点 1","nId":3,"tags":["45"],"nodeId":"2","nodes": [{"text": "孙子节点 1","nId":2,"tags":["42"],"nodeId":"3"},{"text": "孙子节点 2","nId":1,"tags":["41"],"nodeId":"8"}]},{"text": "子节点 2","nId":1,"tags":["45"],"nodeId":"7"}  ]}]';
if(result.r){
t = result.list
var $checkableTree = $("#treeview-checkable").treeview({
data:t,
showTags:true,
showCheckbox: true,   //是否显示复选框
       highlightSelected: true,    //是否高亮选中
       //nodeIcon: 'glyphicon glyphicon-user',    //节点上的图标
       //nodeIcon: 'glyphicon glyphicon-globe',
       emptyIcon: '',    //没有子节点的节点图标
       multiSelect: true,    //多选
       checkboxes: true,
       onNodeChecked: nodeChecked,
       onNodeUnchecked: nodeUnchecked, 
      /*  onNodeExpanded:
          function(event, data) {
              if (data.nodes !== undefined && data.nodes !== null) {
                 
          } 
 */
        
        })
        //展开所有才能进行下面默认的设置
        $checkableTree.treeview('expandAll', [ { silent: true } ]);
        //设置默认的选中
        var checkids = seNodesSel('');
        $checkableTree.treeview('toggleNodeChecked', [checkids, { silent: true } ]);
        dochecklist()
//获取选中的
  // var c = $checkableTree.treeview('getChecked', [ { silent: true } ]);
   //全部选中
   //tree.treeview('checkAll', { silent: $('#chk-check-silent').is(':checked') });
  //全部不选中
  // tree.treeview('uncheckAll', { silent: $('#chk-check-silent').is(':checked') });
  // $checkableTree.treeview('toggleNodeChecked', [ checkableNodes, { silent: $('#chk-check-silent').is(':checked') }]);
  // console.log(c)
   
   
   var findCheckableNodess = function() {
          return $checkableTree.treeview('search', [ $('#input-check-node').val(), { ignoreCase: false, exactMatch: false } ]);
        };
        var checkableNodes = findCheckableNodess();


        // Check/uncheck/toggle nodes
        $('#input-check-node').on('keyup', function (e) {
          checkableNodes = findCheckableNodess();
          $('.check-node').prop('disabled', !(checkableNodes.length >= 1));
        });


        $('#btn-check-node.check-node').on('click', function (e) {
          $checkableTree.treeview('checkNode', [ checkableNodes, { silent: $('#chk-check-silent').is(':checked') }]);
        });


        $('#btn-uncheck-node.check-node').on('click', function (e) {
          $checkableTree.treeview('uncheckNode', [ checkableNodes, { silent: $('#chk-check-silent').is(':checked') }]);
        });


        $('#btn-toggle-checked.check-node').on('click', function (e) {
          $checkableTree.treeview('toggleNodeChecked', [ checkableNodes, { silent: $('#chk-check-silent').is(':checked') }]);
        });


        // Check/uncheck all
        $('#btn-check-all').on('click', function (e) {
          $checkableTree.treeview('checkAll', { silent: $('#chk-check-silent').is(':checked') });
        });


        $('#btn-uncheck-all').on('click', function (e) {
          $checkableTree.treeview('uncheckAll', { silent: $('#chk-check-silent').is(':checked') });
        });
}else{
  layer.alert(result.info, {
     skin: 'layui-layer-molv' //样式类名
     ,closeBtn: 0
    });
}
        
        
    },'json');

});
var nodeCheckedSilent = false;  
function nodeChecked (event, node){
dochecklist();
    if(nodeCheckedSilent){  
        return;  
    }  
    nodeCheckedSilent = true;  
    checkAllParent(node);  
    checkAllSon(node);  
    nodeCheckedSilent = false;  
}  
var nodeUncheckedSilent = false;  
function nodeUnchecked  (event, node){  
dochecklist();
    if(nodeUncheckedSilent)  
        return;  
    nodeUncheckedSilent = true;  
    uncheckAllParent(node);  
    uncheckAllSon(node);  
    nodeUncheckedSilent = false;  
}  
  
//选中全部父节点  
function checkAllParent(node){  
    $('#treeview-checkable').treeview('checkNode',node.nodeId,{silent:true});  
    var parentNode = $('#treeview-checkable').treeview('getParent',node.nodeId);  
    if(!("nodeId" in parentNode)){  
        return;  
    }else{  
        checkAllParent(parentNode);  
    }  
}  
//取消全部父节点  
function uncheckAllParent(node){  
    $('#treeview-checkable').treeview('uncheckNode',node.nodeId,{silent:true});  
    var siblings = $('#treeview-checkable').treeview('getSiblings', node.nodeId);  
    var parentNode = $('#treeview-checkable').treeview('getParent',node.nodeId);  
    if(!("nodeId" in parentNode)) {  
        return;  
    }  
    var isAllUnchecked = true;  //是否全部没选中  
    for(var i in siblings){  
        if(siblings[i].state.checked){  
            isAllUnchecked=false;  
            break;  
        }  
    }  
    if(isAllUnchecked){  
        uncheckAllParent(parentNode);  
    }  
  
}  
//级联选中所有子节点  
function checkAllSon(node){  
    $('#treeview-checkable').treeview('checkNode',node.nodeId,{silent:true});  
    if(node.nodes!=null&&node.nodes.length>0){  
        for(var i in node.nodes){  
            checkAllSon(node.nodes[i]);  
        }  
    }  
}  
//级联取消所有子节点  
function uncheckAllSon(node){  
    $('#treeview-checkable').treeview('uncheckNode',node.nodeId,{silent:true});  
    if(node.nodes!=null&&node.nodes.length>0){  
        for(var i in node.nodes){  
            uncheckAllSon(node.nodes[i]);  
        }  
    }  
}
//处理选中记录
function dochecklist()
{
var content ='';
var ids ='';
var list = $('#treeview-checkable').treeview('getChecked', [ { silent: true } ]);
if(list){
$.each(list,function(name,value){
content += '<p><i class="fa fa-check-circle" aria-hidden="true"></i>'+ value.tags+ '->' + value.text + '</p>';
if(ids==''){
ids = value.id;
}
else{
ids +=',' + value.id;
}
})
}
$('#ids').val(ids);
$('#checkable-output').html(content);
}
 //在id="ids"的input获取data-nodeid
function seNodesSel(sids){
var idsipt = $('#ids').val();
if(sids!=''){
 idsipt = sids;
}
var retids =[];
if(idsipt!=''){
      arr = idsipt.toString().split(',');
 for(var i in arr){
 var tmp = $("li[data-id="+arr[i]+"]").attr("data-nodeid");
 if(tmp!=null&&tmp!=undefined&&tmp!="")
{
 if(retids==''){
 retids[0] = parseInt(tmp);
 }else{
 retids.push(parseInt(tmp));
 }
}
 }
}
return retids;

</script>
<div class="row wrapper wrapper-content animated fadeInRight">
          <div class="col-sm-5">
            <div class="ibox float-e-margins">
                <div class="ibox-title">
                    <h5>{$routetitle}</h5>
                    <div class="ibox-tools">
                    </div>
                    
                </div>
                <div class="ibox-content">
                <div class="form-group row">
                <div class="col-sm-6">
           <input type="input" class="form-control" id="input-check-node" placeholder="搜索节点" value="">
           </div>
                </div>
                <div class="form-group row">
           <div class="col-sm-3">
            <button type="button" class="btn btn-success check-node" id="btn-check-node">选中</button>
           </div>
           <div class="col-sm-3">
            <button type="button" class="btn btn-danger check-node" id="btn-uncheck-node">取消</button>
           </div>
           <div class="col-sm-3">
            <button type="button" class="btn btn-primary check-node" id="btn-toggle-checked">切换</button>
           </div>
                </div>
                    <div id="treeview-checkable" class="test"></div>
                    <div class="form-group row">
                    <!-- <div class="checkbox">
           <label>
             <input type="checkbox" class="checkbox" id="chk-check-silent" value="false">
             Silent (No events)
           </label>
       </div> -->
           <div class="col-sm-6">
            <button type="button" class="btn btn-success" id="btn-check-all">全选</button>
           </div>
           <div class="col-sm-6">
            <button type="button" class="btn btn-danger" id="btn-uncheck-all">全不选</button>
           </div>
        </div>
      </div>
            </div>
        </div>
        
        <div class="col-sm-5">
          <div class="ibox float-e-margins">
          <div class="ibox-content">
          <h2>选中记录</h2>
          <div id="checkable-output"></div>
          </div>
          </div>
        </div>
         <form method="post" action="{:url('node/nodeselect')}" class="form-horizontal">
         {include file="common/editform" /}
         <input type="hidden" id='ids' name='ids' value= "{$ids}" class="form-control">
         <div class="form-group">
                <div class="col-sm-4 col-sm-offset-2">
                    <button class="btn btn-primary" type="submit">保存</button>
                    <button class="btn btn-white" onclick="javascript:history.back(-1);" type="button">取消</button>
                </div>
         </div>
         </form>
        
</div>
03-20
经过网络搜索和信息整合,以下是关于“40s-s2 IT相关含义”的解答: --- ### 关于“40s-s2”在IT领域的可能含义 1. **时间延迟标识** 在某些系统配置文件或脚本中,“40s”可以表示40秒的时间间隔。“s2”则可能是第二个阶段或者第二步的缩写。这种组合常见于定时任务、服务启动顺序或状态检查机制中。 2. **版本控制标记** “40s-s2”也可能是一种内部版本号命名规则的一部分。例如,在软件开发过程中,团队可能会用类似的方式标注特定功能模块的状态更新(如第40次迭代后的子阶段2)。 3. **错误代码或日志标签** 如果出现在服务器日志或其他技术文档里,“40s-s2”也许代表某种异常情况下的响应时间阈值超出警告。具体需要结合上下文查看其定义范围是否匹配实际业务需求。 4. **硬件设备参数描述** 对于嵌入式系统而言,该字符串还能够用来说明某款产品的工作周期设定为四十秒钟并且处于二级运行模式下工作等情况之中 。 5. **算法性能指标** 若是在讨论优化方案时提及此术语,则大概率涉及到程序执行效率评估方面的话题 。比如某个排序函数完成一百个元素排列所需耗时不高于四十分之一秒即满足条件等情形均可纳入此类别考虑范畴之内 。 --- 为了进一步明确这个短语的具体意义,请提供更多背景资料以便准确判断。 --- ### 示例代码解析 假设这是一个简单的 Python 定时器实现案例,其中包含了类似的逻辑结构: ```python import time def stage_timer(stage_name, duration): print(f"Starting {stage_name} for {duration} seconds...") time.sleep(duration) print(f"{stage_name} completed.") if __name__ == "__main__": # Example usage based on "40s-s2" stage_timer("Stage S2", 40) # Simulates a process lasting 40 seconds in Stage S2. ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值