如何避免Shiny应用切换标签页时Popover持续显示?
解决Shiny bs4Dash标签页切换时Popover不自动关闭的问题
你遇到的问题是bs4Dash的Popover默认不会在标签页切换时自动关闭,我们可以通过两种简单方式解决,不需要必须使用server端的addPopover和removePopover:
方案一:纯前端JavaScript实现(推荐)
直接在UI中添加自定义脚本,监听标签页切换事件,自动关闭所有打开的Popover:
library(shiny) library(bs4Dash) ui <- dashboardPage( dashboardHeader(title = "Dashboard", titleWidth = 550, disable= FALSE, sidebarIcon = NULL), dashboardSidebar( sidebarMenu( id = "tabs", # 给侧边栏菜单添加ID,用于监听切换事件 menuItem("dash1", tabName= "dashboard1"), menuItem("dash2", tabName= "dashboard2") ) ), dashboardBody( # 自定义脚本:切换标签时关闭所有Popover tags$script(HTML(" $(document).on('shiny:inputchanged', function(e) { // 检测到侧边栏菜单切换时 if (e.inputName === 'tabs') { // 调用Bootstrap方法关闭所有Popover $('[data-toggle=\"popover\"]').popover('hide'); } }); ")), tabItems( tabItem(tabName = "dashboard1", box( title = "Interpretation", popover( actionButton("goButton", "Click here"), title = "Important information", placement = "right", content = "popover text bla bla" ) ) ), tabItem(tabName = "dashboard2", box( title = "Interpretation", popover( actionButton("goButton2", "Click here"), title = "Important information", placement = "right", content = "popover text bla bla" ) ) ) ) ) ) server <- function(input, output) { } shinyApp(ui = ui, server = server)
方案二:Server端触发关闭逻辑
如果需要结合其他服务器端操作,可以通过Server监听标签切换事件,发送消息给前端关闭Popover:
library(shiny) library(bs4Dash) ui <- dashboardPage( dashboardHeader(title = "Dashboard", titleWidth = 550, disable= FALSE, sidebarIcon = NULL), dashboardSidebar( sidebarMenu( id = "tabs", menuItem("dash1", tabName= "dashboard1"), menuItem("dash2", tabName= "dashboard2") ) ), dashboardBody( # 注册前端消息处理器,用于接收关闭指令 tags$script(HTML(" Shiny.addCustomMessageHandler('closeAllPopovers', function() { $('[data-toggle=\"popover\"]').popover('hide'); }); ")), tabItems( tabItem(tabName = "dashboard1", box( title = "Interpretation", popover( actionButton("goButton", "Click here"), title = "Important information", placement = "right", content = "popover text bla bla" ) ) ), tabItem(tabName = "dashboard2", box( title = "Interpretation", popover( actionButton("goButton2", "Click here"), title = "Important information", placement = "right", content = "popover text bla bla" ) ) ) ) ) ) server <- function(input, output, session) { # 监听标签切换,发送关闭Popover的指令 observeEvent(input$tabs, { session$sendCustomMessage("closeAllPopovers", list()) }) } shinyApp(ui = ui, server = server)
原理说明
两种方案核心都是调用Bootstrap Popover的hide方法,在标签页切换时主动关闭所有打开的弹窗,避免跨标签页残留显示的问题。
内容的提问来源于stack exchange,提问作者Philipp Schulz
相关产品推荐
相关产品推荐

