Shiny中selectizeInput的onChange回调无法触发问题求助
Shiny中selectizeInput的onChange回调触发问题解决方法
原写法无法触发回调的核心原因是没有匹配selectize.js的回调规则,以下是修正后的实现方案:
修正后的可运行代码
library(shiny) js_assign = 'function get_id(elementId) { Shiny.setInputValue("current_id", elementId, {priority: "event"}); }; ' ui = fluidPage( tags$head(tags$script(HTML(js_assign))), selectizeInput( "yes", "Yes", choices = c("a", "b"), options = list( onChange = I('function(value, item) { get_id(this.$element.attr("id")); }') ) ), strong("has selectizeInput been changed yet:"), textOutput("last_clicked"), ) server <- function(input, output, session) { output$last_clicked = renderText({ input$current_id }) } shinyApp(ui = ui, server = server)
关键修正点
- 匹配selectize.js回调签名:
onChange回调默认接收value(选中值)和item(对应选项)两个参数,函数内的this指向selectize实例,而非原始<select>DOM元素。 - 正确获取组件ID:通过
this.$element.attr("id")才能拿到绑定的DOM元素ID,直接用this.id无效,因为this不是DOM节点。 - 使用驼峰式选项名:selectize.js的配置选项需用驼峰命名,必须写
onChange而非小写onchange。 - 保留JS代码原始格式:用
I()包裹JS函数定义,避免Shiny自动转义代码导致失效。
简化版本(无需单独JS函数)
如果不需要复用get_id函数,可以直接把逻辑写在回调里,精简代码:
library(shiny) ui = fluidPage( selectizeInput( "yes", "Yes", choices = c("a", "b"), options = list( onChange = I('function(value, item) { Shiny.setInputValue("current_id", this.$element.attr("id"), {priority: "event"}); }') ) ), strong("has selectizeInput been changed yet:"), textOutput("last_clicked"), ) server <- function(input, output, session) { output$last_clicked = renderText({ input$current_id }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Simon.S.A.
相关产品推荐
相关产品推荐

