代理点击在Modal中不起作用

时间:2018-12-05 22:52:35

标签: r shiny

使用R中的Shiny包,我试图创建一个模式,当焦点位于文本框内时,将在按“ Enter”时关闭。点击“ Enter”与使用我发现的一些javascript按下提供的按钮相同:信用:Dean Attali。来源:https://github.com/daattali/advanced-shiny/blob/master/proxy-click/app.R

在点击“ Enter”或单击按钮后,我对源代码进行了略微修改,以打印在文本框中键入的内容。当前不在模态下运行:

ComponentDidMount

但是,当我尝试从Modal内部执行相同操作时,在聚焦于文本框内的同时单击“ Enter”将不起作用。但是,单击按钮确实即可完成我想要的操作:关闭模式并打印出键入到文本框中的文本。

library(shiny)

jscode <- '
$(function() {
var $els = $("[data-proxy-click]");
$.each(
$els,
function(idx, el) {
var $el = $(el);
var $proxy = $("#" + $el.data("proxyClick"));
$el.keydown(function (e) {
if (e.keyCode == 13) {
$proxy.click();
}
});
}
);
});
'

ui <- fluidPage(
  actionButton("button", "Button"),
  tags$head(tags$script(HTML(jscode))),
  tagAppendAttributes(
    textInput("text", "Text", NULL),
    `data-proxy-click` = "button"
  ),
  textOutput("input_text")
)


server <- function(input, output, session) {

  output$input_text <- renderText({
    input$button
    paste0("You typed: ", isolate(input$text))
  })
}


shinyApp(ui, server)

有没有一种方法可以使“模式”文本框中的焦点对准“ Enter”,使其功能与按“按钮”相同?我仍然是任何类型的编码的新手,因此感谢您的任何帮助或建议!  预先感谢!

1 个答案:

答案 0 :(得分:0)

我用一段时间前在网上找到的东西替换了您的jscode,它似乎可以正常工作:

jscode <- '
$(document).keyup(function(event) {
    if ((event.keyCode == 13)) {
        $("#button").click();
    }
});
'

然后您可以删除tagAppendAttributes,以便您的observeEvent如下所示:

  observeEvent(input$modal, {
    showModal(modalDialog(
      actionButton("button", "Button"),
      textInput("text", "Text", NULL)
    ))
  })

尽管我确定您的方法也可以工作,但这使代码更加简单-只是不确定如何。

更新

下面有完整的代码,以防万一我在上面错误地删除了此行:

tags$head(tags$script(HTML(jscode))),

表示该jscode从未加载过,并且enter键仍无法按预期工作。

完整编辑的代码:

library(shiny)

jscode <- '
$(document).keyup(function(event) {
    if ((event.keyCode == 13)) {
        $("#button").click();
    }
});
'

ui <- fluidPage(
  actionButton('modal', 'Modal Window'),
  textOutput("input_text")
)

server <- function(input, output, session) {

  observeEvent(input$modal, {
    showModal(modalDialog(
      actionButton("button", "Button"),
      tags$head(tags$script(HTML(jscode))),
      textInput("text", "Text", NULL)
    ))
  })

  observeEvent(input$button, {
    removeModal()
  })

  output$input_text <- renderText({
    input$button
    paste0("You typed:", isolate(input$text))
  })
}

shinyApp(ui, server)