使用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”,使其功能与按“按钮”相同?我仍然是任何类型的编码的新手,因此感谢您的任何帮助或建议! 预先感谢!
答案 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)