R Shiny中如何设置datatable渲染时滚动条自动定位到最右侧
R Shiny DT 横向滚动条初始停靠最右侧实现方案
完全可行,核心是利用DT底层依赖的DataTables.js生命周期回调,在表格渲染完成后直接操作滚动容器的DOM属性实现,不需要额外引入其他依赖。
实现逻辑
DT开启scrollX=TRUE后,会生成类名为.dataTables_scrollBody的横向滚动容器,只要在表格渲染完成后,将该容器的scrollLeft属性设置为容器自身的scrollWidth(内容总宽度),就能直接把滚动条定位到最右侧。
方案1:仅首次加载自动靠右(最常用)
在DT的options里添加initComplete回调,仅在表格首次初始化渲染完成后执行一次滚动,适合静态表格场景:
library(shiny) runApp(shinyApp( ui = fluidPage( DT::dataTableOutput("results", width = 300) ), server = function(input, output, session) { output$results <- DT::renderDataTable( mtcars, options = list( scrollX = TRUE, bPaginate = F, # 新增初始化完成回调 initComplete = htmlwidgets::JS( "function() { // 定位当前表格的横向滚动容器 const scrollContainer = $(this).closest('.dataTables_scroll').find('.dataTables_scrollBody'); // 滚动条定位到最右侧 scrollContainer.scrollLeft(scrollContainer[0].scrollWidth); }" ) ) ) } ))
方案2:每次重绘都自动靠右
如果表格存在动态更新、排序、筛选、换页等会触发重绘的操作,需要把回调换成drawCallback,每次表格重绘完成后都自动滚动到最右,避免操作后滚动条回到左侧:
library(shiny) runApp(shinyApp( ui = fluidPage( DT::dataTableOutput("results", width = 300) ), server = function(input, output, session) { output$results <- DT::renderDataTable( mtcars, options = list( scrollX = TRUE, bPaginate = F, # 每次表格重绘完成触发 drawCallback = htmlwidgets::JS( "function() { const scrollContainer = $(this).closest('.dataTables_scroll').find('.dataTables_scrollBody'); scrollContainer.scrollLeft(scrollContainer[0].scrollWidth); }" ) ) ) } ))
注意事项
- 必须开启
scrollX = TRUE才会生成横向滚动容器,否则JS找不到对应元素,功能不会生效 - 如果DT放在tabItem、折叠面板等初始隐藏的容器里,初始化时拿不到正确的容器宽度,可以在JS逻辑里加100ms左右的延时再执行滚动,比如把滚动逻辑包在
setTimeout(() => { /* 滚动代码 */ }, 100)里 - 单页面多表格场景下,上述回调默认只操作当前触发回调的表格实例,不会互相干扰
内容的提问来源于stack exchange,提问作者Kamaloka
相关产品推荐
相关产品推荐

