我想在单击时将特定伪类元素的 Shiny ID 传递给它。如果 UI 元素是在 Shiny 应用程序的 UI 部分创建的,则一切正常。但是当在服务器端(通过 renderUI
)创建 UI 时,它不起作用。以下是可重现的示例。
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
fluidRow(
tags$div(id = "ui1", class = 'shiny-html-output shiny-bound-output',
tags$a(id = "ID1", class = "my-class", href = "#", 'Link 1')
),
uiOutput("ui2")
)
)
server <- function(input, output) {
output$ui2 <- renderUI({
tags$a(id = "ID2", class = "my-class", href = "#", 'Link 2')
})
shinyjs::runjs(
'$(document).ready(function(){
$(".my-class").click(function(){
alert($(this).attr("id"));
});
});')
}
shinyApp(ui, server)
最佳答案
$(document).ready
方法将不起作用,因为在 DOM 准备好之前服务器不会呈现它的输出。使用 session$onFlushed
代替,将 once
参数设置为 TRUE
,然后 shiny 将只运行该函数一次,而不是在每次 session 刷新时运行。
这会起作用:
library(shiny)
library(shinyjs)
script <- "$('.my-class').click(function(){
alert($(this).attr('id'));
});"
ui <- fluidPage(
useShinyjs(),
fluidRow(
tags$div(id = "ui1", class = 'shiny-html-output shiny-bound-output',
tags$a(id = "ID1", class = "my-class", href = "#", 'Link 1')
),
uiOutput("ui2")
)
)
server <- function(input, output, session) {
output$ui2 <- renderUI({
tags$a(id = "ID2", class = "my-class", href = "#", 'Link 2')
})
session$onFlushed(function() {
shinyjs::runjs(script)
}, once=TRUE)
}
shinyApp(ui, server)
关于javascript - 通过在 Shiny App 服务器部分创建的 jQuery UI 元素访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49917894/