【问题标题】:Shiny - Assign Javascript Function to Individual LinksShiny - 将 Javascript 函数分配给各个链接
【发布时间】:2021-07-25 11:58:51
【问题描述】:

在下面的 Shiny 脚本中,当点击超链接时,javascript 函数会返回相关 'a' 标记的 id。但是,此 javascript 函数适用于页面上的所有链接。如果我想限制调用此函数的链接,该怎么做?

例如,在下面的脚本中,我只希望在单击前三个链接中的任何一个而不是最后两个链接时执行该函数。

请注意,这最终将用于具有数百行的动态生成表。


ui <- fluidPage(
    
    tags$script(HTML(
        "$(document).ready(function(){
  $('body').on('click', 'a', function(evt){
    Shiny.setInputValue('clicked_text', evt.target.id);
  });
})"
    )),
    
    tags$a(href = "#", id = 1, "id is 1"),
    br(),
    tags$a(href = "#", id = 2, "id is 2"),
    br(),
    tags$a(href = "#", id = 3, "id is 3"),
    
    br(),
    tags$a(href = "#", id = 4, "id is 4, javascript function should be suppressed for this link"),
    br(),
    tags$a(href = "#", id = 5, "id is 5, javascript function should be suppressed for this link"),
    
    textOutput("clicked_text"),
)

server <- function(input, output) {
    
    output$clicked_text <- eventReactive(input$clicked_text, {
        input$clicked_text
    })
}

shinyApp(ui = ui, server = server)```

【问题讨论】:

    标签: javascript r shiny onclick


    【解决方案1】:

    您可以为要显示值的id 使用if 条件。

    output$clicked_text <- eventReactive(input$clicked_text, {
        if(input$clicked_text %in% 1:3) input$clicked_text
      })
    

    完整代码-

    library(shiny)
    
    ui <- fluidPage(
      
      tags$script(HTML(
        "$(document).ready(function(){
      $('body').on('click', 'a', function(evt){
        Shiny.setInputValue('clicked_text', evt.target.id);
      });
    })"
      )),
      
      tags$a(href = "#", id = 1, "id is 1"),
      br(),
      tags$a(href = "#", id = 2, "id is 2"),
      br(),
      tags$a(href = "#", id = 3, "id is 3"),
      
      br(),
      tags$a(href = "#", id = 4, "id is 4, javascript function should be suppressed for this link"),
      br(),
      tags$a(href = "#", id = 5, "id is 5, javascript function should be suppressed for this link"),
      
      textOutput("clicked_text"),
    )
    
    server <- function(input, output) {
      
      output$clicked_text <- eventReactive(input$clicked_text, {
        if(input$clicked_text %in% 1:3) input$clicked_text
      })
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 如果函数是一种方式,问题是如果我在具有数百个链接的动态生成的表上使用它,那将是一个问题。我希望有某种方法可以从“a”标签调用函数,例如 on.click 事件或类似事件。然后只将 on.click 事件编码到我想使用它的特定链接中。
    • 抱歉,没听懂。你的意思是你事先不知道他们的id,不能使用1:3
    • 正确,ID会动态生成
    【解决方案2】:

    一种可能性是使用onclick 属性:

    tags$script(HTML(
      "function setinput(id) {
        Shiny.setInputValue('clicked_text', id);
      }"
    )),
    
    tags$a(href = "#", id = 1, onclick = "setinput(this.id);", "id is 1"),
    

    另一种可能性是将类设置为您想要的元素:

    tags$script(HTML(
      "$(document).ready(function(){
        $('body').on('click', 'a .myclass', function(evt){
          Shiny.setInputValue('clicked_text', evt.target.id);
        });
      })"
    )),
    
    tags$a(href = "#", class = "myclass", id = 1, "id is 1"),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2021-10-22
      • 2022-08-23
      • 2011-10-20
      相关资源
      最近更新 更多