如何在 jsTree 中禁用多选?
How to disable multi selection in jsTree?
我为 jsTree 插件创建了一个基于 class 选择器的通用代码。我将此插件应用于另一个页面。我只想允许在该特定页面上进行单一选择。我将 multiple
属性 设置为 false
。但它不起作用。我为某个节点触发了 changed.jstree
事件到 show/hide 事件下拉列表。我试图在那个事件中禁用选择,但那也不起作用。
请帮我解决这个问题。
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();
}
}
});
我在 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 插件创建了一个基于 class 选择器的通用代码。我将此插件应用于另一个页面。我只想允许在该特定页面上进行单一选择。我将 multiple
属性 设置为 false
。但它不起作用。我为某个节点触发了 changed.jstree
事件到 show/hide 事件下拉列表。我试图在那个事件中禁用选择,但那也不起作用。
请帮我解决这个问题。
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();
}
}
});
我在 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();
}
}
});
});