Плагин 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
к соответствующему элементу. В этом случае вместо этого вы можете использовать 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; // 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()
. Тогда отправьте его создателям как патч :)
person
David Tang
schedule
05.01.2011