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

shinyTree节点展开(无需选中)时触发自定义函数的实现咨询

实现方案

完全可以实现该需求,核心是监听shinyTree底层依赖的jstree库的open_node节点展开事件,在事件触发时将展开的节点信息同步到Shiny服务端,即可触发指定函数运行。

你之前用shinyjs绑定onclick失效的原因是jstree的节点元素是动态渲染的,直接绑定静态click事件无法命中,监听jstree官方提供的事件是最稳定的实现方式。

完整可运行示例

library(shiny)
library(shinyTree)

ui <- fluidPage(
  shinyTree("tree", contextmenu = TRUE, search = TRUE, unique = TRUE, sort = TRUE),
  # 加入jstree事件监听脚本
  tags$script(HTML("
  $(document).on('shiny:connected', function() {
    // 监听tree组件的节点展开事件
    $('#tree').on('open_node.jstree', function (e, data) {
      // 将展开的节点信息发送到Shiny服务端,priority:event保证立即触发响应
      Shiny.setInputValue('opened_tree_node', data.node.text, {priority: 'event'});
    });
  });
  "))
)

server <- function(input, output, session) {
  
  output$tree <- renderTree({
    list(
      root1 = "",
      root2 = list(
        SubListA = list(leaf1 = "", leaf2 = "", leaf3=""),
        SubListB = list(leafA = "", leafB = "")
      ),
      root3 = list(
        SubListA = list(leaf1 = "", leaf2 = "", leaf3=""),
        SubListB = list(leafA = "", leafB = "")
      )
    )
  })
  
  # 监听节点展开信号,运行你需要的自定义函数
  observeEvent(input$opened_tree_node, {
    # 这里替换成你的自定义函数逻辑
    print(paste0("检测到节点展开,展开节点为:", input$opened_tree_node))
  })
}

shinyApp(ui, server)

扩展说明

  • 如果需要获取节点的更多属性(比如节点ID、层级、父节点信息等),可以修改脚本中data.node的取值字段,jstree的node对象包含节点的全部元信息
  • 如果需要监听节点收起事件,只需将事件名open_node.jstree替换为close_node.jstree即可
  • 如果仅需要点击左侧小三角展开才触发,不需要双击节点展开触发,可以在回调中增加点击事件来源判断,过滤掉双击触发的展开事件即可

内容的提问来源于stack exchange,提问作者wa4557

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:09:01