使用 rhandsontable 注册对 afterOnCellMouseDown 事件的回调
Posted
技术标签:
【中文标题】使用 rhandsontable 注册对 afterOnCellMouseDown 事件的回调【英文标题】:Register callback to afterOnCellMouseDown event with rhandsontable 【发布时间】:2021-08-03 07:43:38 【问题描述】:我有一个 rhandsontable,希望在每次单击单元格时触发一个事件,这样我就可以识别被单击的单元格。
据我所知,这只能使用JS来完成。
我尝试使用基本的.click()
事件,但它使用无参数函数,this
是 html 本身,没有“selectedCell”属性或你有什么。
library(shiny)
library(shinyjs)
library(rhandsontable)
ui <- fluidPage(
useShinyjs(),
actionButton("redraw", "Redraw"),
rHandsontableOutput("test")
)
server <- function(input, output, session)
output$test <- renderRHandsontable(
input$redraw # force re-rendering if desired
runjs("$('#test').click(function()
console.log(this)
);")
rhandsontable(data.frame(a = 1:2, b = 3:4))
)
shinyApp(ui, server)
查看handsontable 文档,我找到了afterOnCellMouseDown
event,这对于我的用例来说似乎已经足够了,它采用了一个带有coords
参数的函数,它通知我所选单元格。我应该可以将它与Shiny.onInputChange
结合使用,让我的应用识别被点击的单元格。
但是,我不知道需要运行什么 JS 才能绑定到 afterOnCellMouseDown
事件。正如我所提到的,使用$('#test')
给了我HTML,我不知道如何访问hot
本身。
【问题讨论】:
【参考方案1】:使用下面的应用程序,被点击单元格的坐标被发送到input$clickedCell
,list(row = i, col = j)
形式的列表。
library(shiny)
library(rhandsontable)
library(htmlwidgets)
jsCode <- c(
"function(el, x) ",
" Handsontable.hooks.add('afterOnCellMouseDown', function(event, coords, TD)",
" Shiny.setInputValue('clickedCell', coords, priority: 'event');",
" );",
""
)
ui <- fluidPage(
rHandsontableOutput("test")
)
server <- function(input, output, session)
output$test <- renderRHandsontable(
rhandsontable(data.frame(a = 1:2, b = 3:4)) %>% onRender(jsCode)
)
observe(print(input$clickedCell))
shinyApp(ui, server)
这适用于应用程序的所有 handsontable
实例。我不知道如何定位特定的(我认为这是不可能的)。
【讨论】:
优秀的答案!我的真实用例实际上使用了多个 rhandsontables,这绑定到每一个。然而,在快速谷歌之后,我意识到我只需要对 JS 代码进行轻微的编辑:Handsontable.hooks.add('after[...]', function([...]) [...], this.hot)
。我会等待惯常的 24 小时,但很快就会收到复选标记!以上是关于使用 rhandsontable 注册对 afterOnCellMouseDown 事件的回调的主要内容,如果未能解决你的问题,请参考以下文章
如何让 rhandsontable 对输入值的变化和自身的变化做出反应?