Javascript 禁用整个jsTree

Javascript 禁用整个jsTree,javascript,jquery,jstree,Javascript,Jquery,Jstree,我使用的是jsTree,它的右边有一个表单,该表单基于所选节点,可以编辑/保存。目标是防止用户在编辑表单时单击树上的任何其他位置 是否有任何方法可以临时禁用/启用树功能,同时保持树在视觉上可用 我尝试使用disable\u node(obj)方法并将其应用于树的根,但似乎不是一个解决方案 有什么建议吗?或者这不是jsTree库的一个可能特性 感谢禁用所选节点,请按以下方式执行: var node = $("#tree").jstree().get_selected(); $("#tree").j

我使用的是jsTree,它的右边有一个表单,该表单基于所选节点,可以编辑/保存。目标是防止用户在编辑表单时单击树上的任何其他位置

是否有任何方法可以临时禁用/启用树功能,同时保持树在视觉上可用

我尝试使用
disable\u node(obj)
方法并将其应用于树的根,但似乎不是一个解决方案

有什么建议吗?或者这不是jsTree库的一个可能特性


感谢

禁用所选节点,请按以下方式执行:

var node = $("#tree").jstree().get_selected();
$("#tree").jstree().disable_node(node);
要禁用所有节点,请使用:

$('#tree li').each( function() {
    $("#tree").jstree().disable_node(this.id);
})
更新

我没有找到阻止打开已禁用节点的方法,所以我也只是禁用已关闭节点的所有子节点


请参见演示:

编辑,正如@charles所指出的,禁用节点并不会禁用菜单插件(至少在自定义菜单中)或拖放-添加第4点以解决此问题

禁用整个树

  • 禁用所有渲染节点-按id禁用每个节点或获取id数组以执行单个调用“禁用_节点”
  • 禁止打开新节点-截取并阻止打开图标上的单击事件
  • 禁止双击打开新节点-修改当前树设置
  • 如果用户可以以任何方式修改树,请临时禁用所有修改设置
    core.check\u callback=false
  • 注意第2点基于未记录的功能,并且(考虑到jstree插件的历史)可能无法在未来的版本中使用

    请参见演示的代码片段

    var数据1=[{
    “id”:“W”,
    “文本”:“世界”,
    “state”:{“opened”:true},
    “儿童”:[{“文本”:“亚洲”},
    {“案文”:“非洲”},
    {“案文”:“欧洲”,
    “state”:{“opened”:false},
    “儿童”:[“法国”、“德国”、“英国”]
    }]
    }];
    $('#Tree').jstree({
    核心:{数据:data1,
    检查回调:true
    }, 
    插件:['dnd','contextmenu','checkbox']
    })
    函数禁用有缺陷(){
    //这还不够
    $('#Tree li.jstree node')。每个(函数(){
    $('#Tree').jstree(“禁用_节点”,this.id)
    })
    }  
    函数禁用(){
    //禁用可见节点
    $('#Tree li.jstree node')。每个(函数(){
    $('#Tree').jstree(“禁用_节点”,this.id)
    })
    //阻止打开新节点
    $(“#Tree i.jstree-ocl”)
    .off('click.block')
    .on('click.block',function(){
    返回false;
    });
    //最终…dbl单击
    $('#Tree').jstree().settings.core.dblclick_toggle=false;
    //最终…阻止所有编辑
    $('#Tree').jstree().settings.core.check_callback=false;
    }  
    函数启用(){
    //再次启用可见节点
    $('#Tree li.jstree node')。每个(函数(){
    $('#Tree').jstree(“enable_node”,this.id)
    });
    //ublock打开新节点
    $(“#Tree i.jstree-ocl”)
    //
    .off('click.block');
    //最终…dbl单击
    $('#Tree').jstree().settings.core.dblclick_toggle=true;
    //最终…取消阻止所有编辑
    //设置为true或重置为您正在使用的任何用户定义函数
    $('#Tree').jstree().settings.core.check_callback=true;
    }
    
    禁用(坏)
    禁用(确定)
    使可能
    
    除了尼古拉·埃尔马科夫的回答之外,禁用节点不会禁用菜单插件(至少是自定义菜单)或拖放。如果您想这样做,您需要在这些函数中添加一个额外的检查(使用JsTree 3.2.1进行测试)

    另一种方法是使用一些东西在jsTree之外执行一些常规的阻塞。

    这个怎么样

    // get an instance of jstree.
    var tree = $.jstree.create('#tree', { ... });
    
    // disable all nodes with one line.
    tree.disable_node(tree.get_json(null, { flat: true }));
    

    你找到解决办法了吗?你好,尼古拉,谢谢你的回复。我最后做的是禁用我的树所在的div容器。我将把它标记为被接受的答案,因为这是一个很好的方法,实际上对我来说,禁用树和div中的所有组件更好。再次感谢!1小提琴似乎与树禁用没有任何关系。2至少在jstree 3中,此方法仅禁用打开的节点,但您仍然可以单击禁用节点上的“打开”图标并打开不会禁用的子树。此方法对我有效,而其他答案不会禁用所有这些交互。唯一的问题是树区域看起来没有被禁用,您可能需要更改,设置较暗的背景等@enigment将所有节点置为灰色对我来说就足够了(甚至太多)。但是设置容器区域的颜色很容易——也许最好的方法是添加一个特定的类是的,同意,让我惊讶的是jsTree没有内置此功能。我们不可能是唯一想使整棵树成为只读的人。@enigment这是rel 1的一个特性。可能导致了一些意想不到的问题,所以它被留下了
    // get an instance of jstree.
    var tree = $.jstree.create('#tree', { ... });
    
    // disable all nodes with one line.
    tree.disable_node(tree.get_json(null, { flat: true }));