【问题标题】:Can I limit jstree check box to only parents with children?我可以将 jstree 复选框限制为只有有孩子的父母吗?
【发布时间】:2019-01-09 13:35:48
【问题描述】:

我想知道我是否只能在没有孩子的父母上提供一个复选框。

类似的东西。我可以选择一个孩子,或者选择所有孩子的孩子的直系父母。

parent01
    parent02
        parent03[]
            child01[]
            child02[]
            child03[]
                parent04[]
                    child04[]
        parent05[]
            child05[]
    parent06
        parent07
            parent08[]
                child06[]
                child07[]

【问题讨论】:

    标签: javascript checkbox jstree


    【解决方案1】:

    这是一个遵循我之前回答的想法的工作示例 - 将有孩子的父母的可见性设置为隐藏。

    为了防止通过单击节点来检查隐藏的复选框, 复选框插件属性 whole_nodetie_selection 应设置为 false

    以下代码正在读取树数据并检查每个树节点,如果父节点有父节点 - 我们称其为祖父节点。 如果是这样,祖父节点复选框的 css 可见性属性设置为 hidden

    var to_hide = []; // ids of nodes that won't have checkboxes
    
    /* get the tree data and find the nodes that have 
       children with children
    */
    function getGrandparents() {
      // tree data
      var item = $('#data').jstree(true).get_json('#', {flat:true});
      console.log(JSON.stringify(item, undefined, 2));
      var parent, grandparent;
      // var nodeIds = item.map(x => x.id);  // ids of nodes in object item
      var nodeIds = item.map(function(x){return x.id;});  // ids of nodes in object item
      for (var i = 0; i < item.length; i += 1) {
        if (has_parent(item[i])) {
          parent = item[nodeIds.indexOf(item[i].parent)];
          if (has_parent(parent)) {
            grandparent = parent.parent + '_anchor';  // node with id grandparent is parent of parent
                                                      // and therefore shouldn't have a checkbox
            if (to_hide.indexOf(grandparent) < 0) {
              to_hide[to_hide.length] = grandparent;  // load id into array of checkboxes that will 
                                                      // be hidden
            }
          }
        }
      }
      function has_parent(who) {
        return ((typeof who.parent !== 'undefined') && (who.parent !== '#'));
      }
    }
    
    function hideGrandparents() {
      var gpa;
      // set visibility of checkbox nodes in to_hide to hidden
      for (var n = 0; n < to_hide.length; n += 1) {
        gpa = document.getElementById(to_hide[n]);
        if (gpa != null ) {
          gpa.getElementsByClassName('jstree-checkbox')[0].style.visibility = 'hidden';
        }
      }
    }
      
    $('#data').jstree({
      'core' : {
        'data' : [
          { "text" : "Root node",
            "children" : [
    	      { "text" : "Child node 1 1", 
                "children" : [
                  { "text" : "Child node 1 1 1" },
                  { "text" : "Child node 1 1 2" }
                ] 
              },
              { "text" : "Child node 1 2",
                "children" : [
                  { "text" : "Child node 1 2 1",
                    "children" : [
                      { "text" : "Child node 1 2 1 1" },
                      { "text" : "Child node 1 2 1 2" }
                    ]                
                  },
                  { "text" : "Child node 1 2 2" }
                ]          
              }
            ]
          },
          { "text" : "Root node 2",
            "children" : [
              { "text" : "Child node 2 1" },
            ]
          }
        ]
      },
      'checkbox': {
        three_state: false,
        whole_node: false,    // should be set to false. otherwise checking the hidden checkbox
                              // could be possible by clicking the node
        tie_selection: false, // necessary for whole_node to work
        cascade: 'up down'
      },
      'plugins': ["checkbox"]
    }).on("ready.jstree", function() {
      getGrandparents();
      hideGrandparents();  // hide checkboxes of root nodes that have children with children
    }).on("open_node.jstree", hideGrandparents);
    <link href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.1.1/themes/default/style.min.css" rel="stylesheet"/>
    
    <div id="data"></div>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.7/jstree.min.js"></script>

    【讨论】:

    • 用活生生的例子更新了答案。由于 Array.prototype.indexOf ,版本 9 或更高版本支持 IE。
    • 谢谢,这就是我要找的。​​span>
    【解决方案2】:

    本网站展示了一个工作示例:

    demos.wijmo.com/TreeView

    但此示例将复选框限制为仅限有孩子的父母

    【讨论】:

    • 这些问题明确表示“仅针对有孩子但没有孩子的父母”。这个例子不是这样的;
    • 我明白,但是这个例子满足了 OP 要求的所有其他要求
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2012-12-07
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2020-05-26
    相关资源
    最近更新 更多