contextmenu
Плагин уже имеет поддержку для этого. Из документации, на которую вы ссылаетесь:
items
: Ожидает объект или функцию, которая должна вернуть объект . Если функция используется, она запускается в контексте дерева и получает один аргумент - узел, который был нажат правой кнопкой мыши.
Поэтому вместо того, чтобы давать contextmenu
жестко запрограммированный объект для работы, вы можете предоставить следующую функцию. Он проверяет элемент, который был выбран для класса с именем «папка», и удаляет пункт меню «удалить», удаляя его из объекта:
function customMenu(node) {
var items = {
renameItem: {
label: "Rename",
action: function () {...}
},
deleteItem: {
label: "Delete",
action: function () {...}
}
};
if ($(node).hasClass("folder")) {
delete items.deleteItem;
}
return items;
}
Обратите внимание, что приведенное выше полностью скроет параметр удаления, но плагин также позволяет отображать элемент при отключении его поведения, добавляя _disabled: true
к соответствующему элементу. В этом случае вы можете использовать вместо этого items.deleteItem._disabled = true
внутри if
инструкции.
Это должно быть очевидно, но не забудьте инициализировать плагин с customMenu
функцией вместо того, что было раньше:
$("#tree").jstree({plugins: ["contextmenu"], contextmenu: {items: customMenu}});
// ^
// ___________________________________________________________________|
Изменить: если вы не хотите, чтобы меню воссоздавалось при каждом щелчке правой кнопкой мыши, вы можете поместить логику в обработчик действий для самого пункта меню удаления.
"label": "Delete",
"action": function (obj) {
if ($(this._get_node(obj)).hasClass("folder") return;
}
Снова отредактируйте: посмотрев исходный код 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()
. Тогда отправьте его создателям как патч :)