如何在jsTree中禁用多选?

Posted

技术标签:

【中文标题】如何在jsTree中禁用多选?【英文标题】:How to disable multi selection in jsTree? 【发布时间】:2021-06-26 03:04:53 【问题描述】:

我为 jsTree 插件创建了一个基于类选择器的通用代码。我将此插件应用到另一个页面。我只想在该特定页面上允许单个选择。我将multiple 属性设置为false。但它不起作用。我触发了changed.jstree 事件来显示/隐藏某个节点的事件下拉列表。我试图在该事件中禁用选择,但这也不起作用。

请帮我解决这个问题。

jsTree插件常用代码:

$(".jsTree").each(function (index, element) 
    if ($(element).data("isprocessed") != "1" && $(element).attr("isprocessed") != 1) 
        $(element).data("isprocessed", "1");
        $(element).attr("isprocessed", "1");
        $(this).jstree(
            core:
            
                check_callback: true
            ,
            checkbox:
            
                keep_selected_style: true,
                three_state: ($(element).data("three-state") == "false" ? false : true)
            ,
            search:
            
                case_insensitive: true,
                show_only_matches: true
            ,
            plugins: ["checkbox", "search", "changed"]
        ).on('search.jstree', function (nodes, str, res) 
            if (str.nodes.length === 0) 
                $(element).jstree(true).hide_all();
            
        );
    
);

另一个页面上的jsTree代码:

$(document).ready(function () 
    $('#jsEvent').hide();
    $('#jsRoleTree').jstree(
        checkbox: 
            multiple: false,
        
    );      
);

       
/* To select an event for event-related roles */
$('#jsRoleTree').on('changed.jstree', function (e, data) 
    $('#jsEvent').hide(); //Hide event dropdown
    var ref = $('#jsRoleTree').jstree(true);
    var nodes = ref.get_checked(); // use method get_checked

    $.each(nodes, function (i, nd) 
        if (nd != data.id)
            ref.disable_checkbox(nd);
    );
    
    //Show event dropdown
    for (i = 0; i < data.selected.length; i++) 
        var selectedNode = $(data.instance.get_node(data.selected[i]).text).text().trim();
        if (selectedNode == '@Constant.EventAdmin' || selectedNode == '@Constant.EventContributor' || selectedNode == '@Constant.EventSubscriber') 
            $('#jsEvent').show(); 
        
    
);

【问题讨论】:

【参考方案1】:

我在https://jsfiddle.net/mrc4fun/0a9r0902/ 的帮助下解决了这个问题。我对changed.jstree 事件进行了更改。

现在代码如下:

$(document).ready(function () 
    $('#jsEvent').hide();
    $('#jsRoleTree').jstree(
        checkbox: 
            three_state: false,
            cascade: 'none'
        
    );

    $('#jsRoleTree').on('changed.jstree', function (e, data) 
        $('#jsEvent').hide();
                
        //To allow singe-selection only
        if (data.selected.length > 1) 
            data.instance.uncheck_all(); //will invoke the changed event once
            data.instance.check_node(data.node);/*currently selected node*/
            return;
        

        //To show the event dropdown
        for (i = 0; i < data.selected.length; i++) 
           var selectedNode = $(data.instance.get_node(data.selected[i]).text).text().trim();
           if (selectedNode == '@Constant.EventAdmin' || selectedNode == '@Constant.EventContributor' || selectedNode == '@Constant.EventSubscriber') 
               $('#jsEvent').show();
           
        
    );
);

【讨论】:

以上是关于如何在jsTree中禁用多选?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用多选框中的其余所有项目

如何在 Ember 中使用 jsTree 插件

在 jsTree 中,如何通过节点 id 获取节点信息?

如何从 iframe 源获取 jstree 实例?

如何在jstree复选框中获取阴影元素?

如何使用 AJAX 生成 jstree?