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(),. Потім надішліть його творцям як патч :)