Das contextmenu
Plugin unterstützt dies bereits. Aus der Dokumentation, die Sie verlinkt haben:
items
: Erwartet ein Objekt oder eine Funktion, die ein Objekt zurückgeben soll . Wenn eine Funktion verwendet wird, wird sie im Kontext des Baums ausgelöst und erhält ein Argument - den Knoten, auf den mit der rechten Maustaste geklickt wurde.
Anstatt contextmenu
ein fest codiertes Objekt zum Arbeiten anzugeben, können Sie die folgende Funktion bereitstellen. Es überprüft das Element, auf das geklickt wurde, auf eine Klasse mit dem Namen "Ordner" und entfernt das Menüelement "Löschen", indem es aus dem Objekt gelöscht wird:
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;
}
Beachten Sie, dass oben die Löschoption vollständig ausgeblendet wird. Mit dem Plugin können Sie jedoch auch ein Element anzeigen, während Sie dessen Verhalten deaktivieren, indem Sie _disabled: true
es dem entsprechenden Element hinzufügen . In diesem Fall können Sie stattdessen items.deleteItem._disabled = true
innerhalb der if
Anweisung verwenden.
Sollte offensichtlich sein, aber denken Sie daran, das Plugin mit der customMenu
Funktion zu initialisieren, anstatt mit dem, was Sie zuvor hatten:
$("#tree").jstree({plugins: ["contextmenu"], contextmenu: {items: customMenu}});
// ^
// ___________________________________________________________________|
Bearbeiten: Wenn Sie nicht möchten, dass das Menü bei jedem Rechtsklick neu erstellt wird, können Sie die Logik in den Aktionshandler für das Menüelement Löschen selbst einfügen.
"label": "Delete",
"action": function (obj) {
if ($(this._get_node(obj)).hasClass("folder") return; // cancel action
}
Erneut bearbeiten: Nach dem Betrachten des jsTree-Quellcodes sieht es so aus, als würde das Kontextmenü jedes Mal neu erstellt, wenn es trotzdem angezeigt wird (siehe show()
und parse()
Funktionen), sodass ich bei meiner ersten Lösung kein Problem sehe.
Ich mag jedoch die von Ihnen vorgeschlagene Notation mit einer Funktion als Wert für _disabled
. Ein möglicher Weg, den Sie erkunden sollten, besteht darin, ihre parse()
Funktion mit Ihrer eigenen zu versehen, die die Funktion bei bewertet disabled: function () {...}
und das Ergebnis darin speichert _disabled
, bevor Sie das Original aufrufen parse()
.
Es wird auch nicht schwierig sein, den Quellcode direkt zu ändern. Zeile 2867 der Version 1.0-rc1 ist die relevante:
str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
Sie können einfach eine Zeile vor dieser hinzufügen, die dies überprüft $.isFunction(val._disabled)
, und wenn ja val._disabled = val._disabled()
. Dann sende es den Machern als Patch :)