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
相关产品推荐
相关产品推荐

