Плагин contextmenu
уже поддерживает это. Из документации, на которую вы ссылаетесь:
items
: Ожидается объект или функция, которая должна возвращать объект . Если функция используется, она запускается в контексте дерева и получает один аргумент - узел, по которому щелкнули правой кнопкой мыши.
Таким образом, вместо того, чтобы дать contextmenu
жестко запрограммированный объект для работы, вы можете предоставить следующую функцию. Он проверяет элемент, который был выбран для класса с именем «папка», и удаляет пункт меню «удалить», удаляя его из объекта:
function customMenu(node) {
// The default set of all items
var items = {
renameItem: { // The "rename" menu item
label: "Rename",
action: function () {...}
},
deleteItem: { // The "delete" menu item
label: "Delete",
action: function () {...}
}
};
if ($(node).hasClass("folder")) {
// Delete the "delete" menu item
delete items.deleteItem;
}
return items;
}
Обратите внимание, что приведенное выше полностью скрывает параметр удаления, но плагин также позволяет отображать элемент при отключении его поведения, добавляя _disabled: true
к соответствующему элементу. В этом случае вместо оператора if
можно использовать items.deleteItem._disabled = true
.
Должно быть очевидным, но не забудьте инициализировать плагин с функцией customMenu
вместо того, что вы имели ранее:
$("#tree").jstree({plugins: ["contextmenu"], contextmenu: {items: customMenu}});
// ^
// ___________________________________________________________________|
Редактировать: Если вы не хотите, чтобы меню создавалось при каждом щелчке правой кнопкой мыши, вы можете поместить логику в обработчик действий для самого элемента меню удаления.
"label": "Delete",
"action": function (obj) {
if ($(this._get_node(obj)).hasClass("folder") return; // cancel action
}
Отредактируйте снова: После просмотра исходного кода jsTree, похоже, что контекстное меню создается заново каждый раз, когда оно все равно отображается (см. Функции show()
и parse()
), поэтому Я не вижу проблемы с моим первым решением.
Однако мне нравятся обозначения, которые вы предлагаете, с функцией в качестве значения для _disabled
. Потенциальный путь для изучения - обернуть их функцию parse()
своей собственной, которая оценивает функцию в disabled: function () {...}
и сохраняет результат в _disabled
, перед вызовом оригинального parse()
.
Также не составит труда изменить их исходный код напрямую. Соответствует строка 2867 версии 1.0-rc1:
str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
Вы можете просто добавить строку перед этой, которая проверяет $.isFunction(val._disabled)
, и если да, val._disabled = val._disabled()
. Затем отправьте его создателям в виде патча:)