You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除jsTreeR包渲染的层级树中目标节点下的元素

jsTreeR 拖拽区元素删除功能实现

核心改动点

  • 自定义右键菜单规则:只有拖入「Drag here」区域的元素才会弹出右键菜单,且菜单仅包含Delete选项,其余所有节点右键无操作项
  • 补全权限校验回调:从底层拦截所有对Menu原始节点的修改、删除操作,同时阻止元素被拖到Drag here区域外
  • 保留原有功能:支持从Menu复制固定选项到拖拽区、拖拽区内元素自由排序

完整可运行代码

library(jsTreeR)
library(shiny)

nodes <- list(
  list(
    text = "Menu",
    type = "menu",
    state = list(opened = TRUE),
    children = list(
      list(text = "A", type = "moveable", state = list(disabled = TRUE)),
      list(text = "B", type = "moveable", state = list(disabled = TRUE)),
      list(text = "C", type = "moveable", state = list(disabled = TRUE)),
      list(text = "D", type = "moveable", state = list(disabled = TRUE))
    )
  ),
  list(text = "Drag here:", type = "target", state = list(opened = TRUE))
)

# 全局操作权限校验回调
checkCallback <- JS(
  "function(operation, node, parent, position, more) {",
  "  // 拦截所有非Drag here区域的复制/移动操作",
  "  if(operation === 'copy_node' || operation === 'move_node') {",
  "    if(parent.id === '#' || parent.type !== 'target') {",
  "      return false;",
  "    }",
  "  }",
  "  // 拦截所有对固定节点(Menu、原始选项、Drag here根节点)的删除操作",
  "  if(operation === 'delete_node') {",
  "    if(node.type === 'menu' || node.type === 'moveable' || node.type === 'target') {",
  "      return false;",
  "    }",
  "  }",
  "  return true;",
  "}"
)

dnd <- list(
  always_copy = TRUE,
  is_draggable = JS(
    "function(node) {",
    "  return node[0].type === 'moveable';",
    "}"
  )
)

# 自定义右键菜单配置
customContextMenu <- JS(
  "function(node) {",
  "  // 仅对Drag here区域内的动态添加节点显示删除选项",
  "  if(node.parent !== '#' && this.get_node(node.parent).type === 'target') {",
  "    return {",
  "      delete: {",
  "        label: 'Delete',",
  "        action: function (data) {",
  "          const inst = $.jstree.reference(data.reference);",
  "          inst.delete_node(node);",
  "        }",
  "      }",
  "    };",
  "  }",
  "  // 其余节点不显示任何右键操作项",
  "  return {};",
  "}"
)

ui <- fluidPage(
  jstreeOutput("jstree")
)  

server <- function(input, output){
  output[["jstree"]] <- renderJstree({
    jstree(
      nodes, 
      dragAndDrop = TRUE, 
      dnd = dnd, 
      checkCallback = checkCallback, 
      contextMenu = list(items = customContextMenu),
      types = list(
        moveable = list(), 
        target = list(),
        menu = list()
      )
    )
  })
}  

shinyApp(ui, server)

效果说明

  • 右键点击Menu下的固定选项、Menu节点本身、Drag here根节点,不会弹出任何操作菜单,完全禁止修改原始内容
  • 将选项拖入Drag here区域后,右键点击区域内的元素,只会弹出删除选项,点击即可移除对应元素
  • 拖拽区域内的元素可以自由拖动调整顺序,无法被拖出指定区域

功能效果演示

内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:31:03