单击闪亮的输入以获取单击的最后一个输入不适用于选择输入或选择输入



我想触发一个包含上次点击输入的输入id的响应。对于一些输入,比如numericInputtextInput,我的方法是有效的。但对selectInputselectizeInput不起作用。我试过在JS表达式中使用各种选择器,但没有一个捕获selectInputselectizeInput

这是一个代表。当您单击前两个输入中的任何一个时,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);
}
});
});"
)
)
)

相关内容

  • 没有找到相关文章

最新更新