javascript - 通过在 Shiny App 服务器部分创建的 jQuery UI 元素访问

标签 javascript jquery r shiny

我想在单击时将特定伪类元素的 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/

相关文章:

javascript - jQuery 在淡入之前淡出

javascript - Ajax、jQuery、Django。这是如何设置的?

Javascript按钮onclick获取输入值并提交post请求

r - 用串扰过滤两个表

R:在同一个箱线图上画一条线

r - 使用 fread() 选择行和列,就像 read.csv.sql() 那样

asp.net - Sharepoint WebPart 中 Silverlight 控件的客户端 ID

javascript - 415 使用 JQuery/FormData 和 Web Api 时不支持的媒体类型

php - 当行内容来自数据库时,单击按钮动态添加表行

javascript - JQuery `.after()` 渲染 HTML 而不是解析它