使用 rhandsontable 注册对 afterOnCellMouseDown 事件的回调

Posted

技术标签:

【中文标题】使用 rhandsontable 注册对 afterOnCellMouseDown 事件的回调【英文标题】:Register callback to afterOnCellMouseDown event with rhandsontable 【发布时间】:2021-08-03 07:43:38 【问题描述】:

我有一个 rhandsontable,希望在每次单击单元格时触发一个事件,这样我就可以识别被单击的单元格。

据我所知,这只能使用JS来完成。

我尝试使用基本的.click() 事件,但它使用无参数函数,thishtml 本身,没有“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$clickedCelllist(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 从逻辑 == TRUE 收集值

如何让 rhandsontable 对输入值的变化和自身的变化做出反应?

如何将 'afterColumnResize' 事件与 'rhandsontable' 一起使用?

在 Shiny 中使用 rhandsontable 时出错

使用 rhandsontable 包在闪亮上编辑多个数据框

获取 Rhandsontable 的选定行