我想触发一个包含上次点击输入的输入id的响应。对于一些输入,比如numericInput
和textInput
,我的方法是有效的。但对selectInput
和selectizeInput
不起作用。我试过在JS表达式中使用各种选择器,但没有一个捕获selectInput
或selectizeInput
。
这是一个代表。当您单击前两个输入中的任何一个时,renderText会更新,但最后两个则不会。
library(shiny)
ui <- fluidPage(
tags$head(
tags$script(
htmlwidgets::JS("$( document ).on('click', '.form-control, .shiny-bound-input, .selectized', function() {
Shiny.setInputValue('last_input', this.id);
});")
)
),
numericInput("num1", "Numeric", 0),
textInput("text1", "Text"),
selectInput("select1", "Select", choices = LETTERS[1:4]),
selectInput("selectize1", "Selectize", choices = letters[1:4]),
textOutput("textout")
)
server <- function(input, output, session) {
output$textout <- renderText({
input$last_input
})
}
shinyApp(ui, server)
这是因为id属于select
元素,而您没有点击该元素。
我的第一个想法是搜索具有id的第一个父元素:
tags$script(
HTML("$( document ).on('click', '.form-control, .shiny-bound-input, .selectized', function() {
var $parentWithId = $(this).closest('*[id]');
Shiny.setInputValue('last_input', $parentWithId.attr('id'));
});")
)
但selectizeInput
仍然不起作用。
也许你更想:
tags$script(
HTML("$(document).on('shiny:inputchanged', function(event) {
Shiny.setInputValue('last_input', event.name);
});")
)
返回最后修改的输入的id。
编辑
正如您在评论中所指出的,当由update*
函数从服务器引起更改时,此方法还设置last_input
。下面是防止这种情况发生的方法:
tags$script(
HTML("$(document)
.on('shiny:updateinput', function(e) {
$(e.target).one('shiny:inputchanged', function(ev) {
ev.stopPropagation();
});
})
.on('shiny:inputchanged', function(e) {
Shiny.setInputValue('last_input', e.name);
});")
)
我有同样的问题,过了一会儿,我找到了解决方案。首先,您必须确定selectInputid的开始字符串。:我们假设id以字符串id_name开头. Shiny selectInput包含在div中当点击输入时,它会发生变化,并且在点击之后,选定的值被分配给select元素,其中包含名为id的输入id。. 获取id,当div
tags$head(
tags$script(
HTML(
"$(document).ready(function(){
$('div').on('change', 'select',function(evt){
if(evt.target.id.match('^id_name')=='id_name'){
Shiny.setInputValue('select_id', evt.target.id);
}
});
});"
)
)
)