R Shiny中DataTable重绘后JS回调函数失效问题求助
R Shiny中DataTable重绘后右键上下文菜单无法获取行数据问题
问题现象
- 开发的R Shiny应用实现了右键点击DataTable任意行弹出上下文菜单,菜单选项可打印该行数据
- 应用首次启动时,上下文菜单及功能完全正常;但点击“Update table”按钮重绘DataTable后,右键菜单仍能弹出,点击选项后却仅显示undefined,无法获取实际行数据
问题分析与尝试
- 推测重绘后DataTable的ID被覆盖,回调函数通过
selector: '#mytable tr'无法正确指向新创建的表元素 - 实际应用场景需要完整重建DataTable,无法使用proxyDataTables方案;尝试过drawCallback函数也未解决问题
- 预期目标:DataTable重绘后,右键上下文菜单的回调函数仍能正常获取并显示行数据
可复现代码
library(shiny) library(DT) c1 <- c( "$.contextMenu({", "selector: '#mytable tr',", "trigger: 'right',", "callback: function(key, options) {", "var row = table.row(options.$trigger);", "var data = row.data();", "var m = 'clicked: ' + key + ' ' + data;", "var newtab = window.open('','anotherWindow', 'width=750,height=600');", "newtab.document.write('<p> Below is the row data! </p>', '<br>',data);", "},", "items: {", "'showdata': {name:'Show row data', icon: 'fa-regular fa-folder'}, "'showsamedata': {name:'Show same row data again', icon: 'fa-regular fa-folder'}", "}", "})" ) ui <- fluidPage( tags$head( tags$link(rel="stylesheet", href="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.9.2/jquery.contextMenu.min.css"),tags$script(src="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.9.2/jquery.contextMenu.min.js"),tags$script(src="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.9.2/jquery.ui.position.js"),tags$script(src="https://kit.fontawesome.com/293ef49cbe.js") ), DTOutput("mytable"), actionButton(inputId = "update", width = "150px", #style = "height:35px;border:3px;border-style:double;border-color:black;", label = div(style="vertical-align:middle;font-weight:bold","Update table")) ) server <- function(input, output) { #initial rendering output$mytable <- renderDataTable({ datatable(iris, callback = JS(c1)) }) #re-rendering observeEvent(input$update, { output$mytable <- renderDataTable({ datatable(iris, callback = JS(c1)) }) }) } shinyApp(ui, server)
效果说明
- 首次加载:右键点击行,选择菜单选项后可正常显示该行数据
- 重绘后:右键点击行,选择菜单选项后仅显示undefined
内容的提问来源于stack exchange,提问作者michel dangov
相关产品推荐
相关产品推荐

