Shiny app中的Javascript只加载一次

问题描述 投票:-1回答:1

编辑:通过查找可重现的示例的广义问题

下面的应用程序有两个tabPanels,每个都在sidebarPanel内有一些Javascript。我希望Tab 1中的Javascript能够随时运行Tab 1(即,当我最初启动应用程序时以及从Tab 2导航回Tab 1时)。此外,我希望我导航到该选项卡的任何时候都可以运行选项卡2中的Javascript。

相反,两个选项卡的Javascript在启动应用程序后立即运行,然后再也不会运行。

作为上下文,我构建了这个示例,因为我在尝试使用Javascript在我的Shiny应用程序中放置Amazon Associates广告时遇到了这个问题。

可重复的例子

library(shiny)

ui = navbarPage( "",
                  tabPanel( "Tab 1",
                            mainPanel(

                              wellPanel("Blah blah blah"), 
                              width = 6
                            ),

                            sidebarPanel(

                              # only runs once, like the ads
                              HTML('<script type="text/javascript"> alert("Tab 1 is talking"); </script>')

                              # # runs every time
                              #HTML('<b> test </b>')

                              , width=6 )
                  ),

                  tabPanel( "Tab 2",

                            mainPanel(
                              wellPanel("Blah blah blah"), 
                              width = 6

                            ),  # ends mainPanel

                            sidebarPanel(

                              # only runs once, like the ads
                              HTML('<script type="text/javascript"> alert("Tab 2 is talking"); </script>')

                              # # runs every time
                              #HTML('<b> test </b>')

                              , width=6 )

                            )

)

server <- function(input, output) {

}

app = shinyApp( ui, server )
shiny
1个回答
1
投票

选项卡仅切换页面上已有内容的可见性。因此,当应用程序启动时,Tab 2实际上已加载但隐藏了。如果您希望选项卡动态添加和删除脚本,则可以使用renderUI基于活动选项卡执行此操作。或者sendCustomMessageaddCustomMessageHandler

这是使用renderUI的示例:

library(shiny)

ui = navbarPage("", id = "navbar",
  tabPanel( "Tab 1",
           mainPanel(
             wellPanel("Blah blah blah"), 
             width = 6
           ),

           sidebarPanel(
             uiOutput("tab1"),
             width = 6
           )
  ),

  tabPanel( "Tab 2",
           mainPanel(
             wellPanel("Blah blah blah"), 
             width = 6
           ),

           sidebarPanel(
             uiOutput("tab2"),
             width=6 
           )
  )
)

server <- function(input, output) {
  output$tab1 <- renderUI({
    req(input$navbar == "Tab 1")
    HTML('<script type="text/javascript"> alert("Tab 1 is talking"); </script>')
  })

  output$tab2 <- renderUI({
    req(input$navbar == "Tab 2")
    HTML('<script type="text/javascript"> alert("Tab 2 is talking"); </script>')
  })
}

shinyApp( ui, server )
© www.soinside.com 2019 - 2024. All rights reserved.