我有一个带标签的闪亮应用程序,根据用户输入生成相当多的内容,我试图弄清楚每次生成新内容时如何滚动到活动选项卡的底部。我试着实现这个question给出的答案,但它似乎不起作用。我对javaScript的经验很少,所以它可能只是需要根据我的具体示例进行更改。这是一个非常愚蠢的玩具示例,我尝试从链接的问题中实现答案:
library(shiny)
ui <- fluidPage(
tags$script(
'
Shiny.addCustomMessageHandler("scrollCallback",
function(color) {
var objDiv = document.getElementById("outDiv");
objDiv.scrollTop = objDiv.scrollHeight;
}
);'
),
tabsetPanel(id = "mainPanels",
tabPanel("FirstPanel",
actionButton("outGen", "GenerateOutput"))),
uiOutput("randomOutput")
)
server <- function(input, output, session) {
output$randomOutput <- renderUI({
req(input$outGen)
lapply(1:50, function(x)p("FooBar"))
})
observeEvent(input$outGen,{
session$sendCustomMessage(type = "scrollCallback", 1)
})
}
runApp(shinyApp(ui,server))
按下生成输出按钮后,我试图找到一种滚动到标签底部的方法。
答案 0 :(得分:3)
这是一个有效的修正。进行了以下更改:
div
。这是必要的,否则某些变量将无法在div
对象中正确初始化。randomOutput
div添加了必要的CSS溢出:自动样式,以便滚动条滚动。getElementById
正在查询错误的div)scrollCallback
以下是代码:
library(shiny)
ui <- fluidPage(
tags$style('#randomOutput { height: 450px; overflow: auto;}'),
tags$script(
'
Shiny.addCustomMessageHandler("scrollCallback",
function(msg) {
console.log("aCMH" + msg)
var objDiv = document.getElementById("randomOutput");
objDiv.scrollTop = objDiv.scrollHeight - objDiv.clientHeight;
console.dir(objDiv)
console.log("sT:"+objDiv.scrollTop+" = sH:"+objDiv.scrollHeight+" cH:"+objDiv.clientHeight)
}
);'
),
tabsetPanel(id = "mainPanels",
tabPanel("FirstPanel",
actionButton("outGen", "GenerateOutput"))),
uiOutput("randomOutput")
)
server <- function(input, output, session) {
n <- 0
output$randomOutput <- renderUI({
input$outGen
n <<- n + 50
lapply(1:50, function(x)p(paste0("FooBar-",x+n-50)))
})
observeEvent(input$outGen,{
session$sendCustomMessage(type = "scrollCallback", 1)
})
}
runApp(shinyApp(ui,server))
以下是测试时的样子: