Javascript 使用TAB编辑DT表格上的下一个单元格

Javascript 使用TAB编辑DT表格上的下一个单元格,javascript,r,shiny,datatables,dt,Javascript,R,Shiny,Datatables,Dt,在可编辑的DT中按TAB键后是否有编辑下一个单元格的技巧? 这将有助于更快地编辑整行 下面是可编辑DT的基本示例 library(shiny) library(DT) ui <- fluidPage( DT::dataTableOutput('tbl1'), verbatimTextOutput("print") ) server <- function(input, output, session) { data <- reactiveValue

在可编辑的DT中按TAB键后是否有编辑下一个单元格的技巧?
这将有助于更快地编辑整行

下面是可编辑DT的基本示例

library(shiny)
library(DT)

ui <- fluidPage(
    DT::dataTableOutput('tbl1'),
    verbatimTextOutput("print")
)

server <- function(input, output, session) {

    data <- reactiveValues(x = iris[1:10,1:4])

    output$tbl1 <- DT::renderDataTable({
        DT::datatable(data = isolate(data$x), editable = TRUE, rownames = FALSE)
    })

    proxy_tbl1 <- dataTableProxy("tbl1")

    observeEvent(input$tbl1_cell_edit, {
        info = input$tbl1_cell_edit
        i = info$row
        j = info$col + 1
        v = info$value
        data$x[i, j] <- DT::coerceValue(v, data$x[i, j])
        replaceData(proxy_tbl1, data$x, resetPaging = FALSE, rownames = FALSE)
    })

    output$print <- renderPrint({
        print(data$x)
    })
}

shinyApp(ui, server)
库(闪亮)
图书馆(DT)

ui这在编辑器扩展中可能是可行的,但它不是免费的

这里有一些非常接近的东西,使用KeyTable扩展

library(shiny)
library(DT)

ui <- fluidPage(
  DTOutput("table")
)

js <- c(
  "table.on('key', function(e, datatable, key, cell, originalEvent){",
  "  var targetName = originalEvent.target.localName;",
  "  if(key == 13){",
  "    if(targetName == 'body'){",
  "      $(cell.node()).trigger('dblclick.dt');",
  "    }else if(targetName == 'input'){",
  "      $(originalEvent.target).trigger('blur');",
  "    }",
  "  }",
  "})"
)

server <- function(input, output, session){
  output$table <- renderDT({
    datatable(
      iris,
      selection = "none",
      editable = TRUE, 
      callback = JS(js),
      extensions = "KeyTable",
      options = list(
        keys = TRUE
      )
    )
  })
}

shinyApp(ui, server)
现在,编辑单元格时,您可以:

  • 按Enter键验证编辑并保持在同一位置

  • 或者按Tab键或箭头键验证编辑和导航,无需按Enter键验证编辑


编辑2 代码如下:

  • 在表格中导航,按Enter键进行编辑

  • 按Enter键验证编辑并保持在同一位置

  • 如果正在编辑单元格,则按Tab键或箭头键将触发对新单元格的编辑


js听起来是个好主意。您可以向提交功能请求。谢谢你不觉得这会有关系吗?非常感谢,非常好的解决方案!“我要找的主要事情是不要使用鼠标。”我很高兴能帮上忙。查看我的编辑,我添加了一个更好的解决方案。此解决方案无需按Enter键:只要按导航键(Tab或箭头),编辑就会生效。再次感谢@Stéphane,甚至更好。您认为在按下箭头或tab键后是否可以发送“enter”或“dblclick”事件?我试图将此添加到您的代码中,但没有成功(我几乎完全不知道js)
js <- c(
  "table.on('key', function(e, datatable, key, cell, originalEvent){",
  "  var targetName = originalEvent.target.localName;",
  "  if(key == 13 && targetName == 'body'){",
  "    $(cell.node()).trigger('dblclick.dt');",
  "  }",
  "});",
  "table.on('keydown', function(e){",
  "  if(e.target.localName == 'input' && [9,13,37,38,39,40].indexOf(e.keyCode) > -1){",
  "    $(e.target).trigger('blur');",
  "  }",
  "});"
)
js <- c(
  "table.on('key', function(e, datatable, key, cell, originalEvent){",
  "  var targetName = originalEvent.target.localName;",
  "  if(key == 13 && targetName == 'body'){",
  "    $(cell.node()).trigger('dblclick.dt');",
  "  }",
  "});",
  "table.on('keydown', function(e){",
  "  if(e.target.localName == 'input' && [9,13,37,38,39,40].indexOf(e.keyCode) > -1){",
  "    $(e.target).trigger('blur');",
  "  }",
  "});",
  "table.on('key-focus', function(e, datatable, cell, originalEvent){",
  "  var targetName = originalEvent.target.localName;",
  "  var type = originalEvent.type;",
  "  if(type == 'keydown' && targetName == 'input'){",
  "    if([9,37,38,39,40].indexOf(originalEvent.keyCode) > -1){",
  "      $(cell.node()).trigger('dblclick.dt');",
  "    }",
  "  }",
  "});"
)