You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Shiny模态框打开时下拉菜单默认处于关闭状态

解决模态框打开时下拉菜单默认展开的问题

我来帮你搞定这个问题!你遇到的情况是因为Shiny原生的selectInput依赖Selectize.js,当模态框加载完成时,下拉菜单意外处于展开状态。我们可以通过两种方式解决:

方法一:利用Selectize.js API手动关闭下拉

修改你的modal.js代码,在模态框完全显示后,调用Selectize的关闭方法,确保下拉菜单默认收起:

$('.ui.modal').modal({
  onVisible: function() {
    $('#my_table').show().trigger('shown');
    // 调用Selectize的close方法关闭下拉菜单
    $('#picker').selectize()[0].selectize.close();
  }
}).modal('show');

替换原代码中的modal.js后,完整代码如下:

library(shiny)
library(shinyjs)
library(shiny.semantic)
library(DT)

modal.js <- "$('.ui.modal').modal({
  onVisible: function() {
    $('#my_table').show().trigger('shown');
    $('#picker').selectize()[0].selectize.close();
  }
}).modal('show');"

ui <- semanticPage(
  suppressDependencies("bootstrap"),
  useShinyjs(),
  div(
    class = "ui modal",
    div(class = "header", "Modal header"),
    div(class = "content",
        div(class = "ui raised segment",
            selectInput(inputId = "picker", label = "Select column", choices = names(iris), selected = names(iris)[-1], multiple=T),
            br(),
            DT::dataTableOutput("my_table")))
  ),
  div(class = "ui basic button action-button", id = "open_modal", "Open modal ui")
)

server <- function(input, output, session) {
  output$my_table = DT::renderDataTable(head(iris[,input$picker]))
  observeEvent(input$open_modal, runjs(modal.js))
}

shinyApp(ui, server, options = list(launch.browser = TRUE))

方法二:改用shiny.semantic原生下拉组件

既然你在用shiny.semantic,更推荐使用它的dropdown_input组件,这样能更好地和Semantic UI模态框兼容,避免样式和行为冲突:

library(shiny)
library(shinyjs)
library(shiny.semantic)
library(DT)

modal.js <- "$('.ui.modal').modal('show'); $('#my_table').show().trigger('shown');"

ui <- semanticPage(
  suppressDependencies("bootstrap"),
  useShinyjs(),
  div(
    class = "ui modal",
    div(class = "header", "Modal header"),
    div(class = "content",
        div(class = "ui raised segment",
            # 改用shiny.semantic的dropdown_input
            dropdown_input(
              input_id = "picker",
              label = "Select column",
              choices = names(iris),
              selected = names(iris)[-1],
              multiple = TRUE
            ),
            br(),
            DT::dataTableOutput("my_table")))
  ),
  div(class = "ui basic button action-button", id = "open_modal", "Open modal ui")
)

server <- function(input, output, session) {
  output$my_table = DT::renderDataTable(head(iris[,input$picker]))
  observeEvent(input$open_modal, runjs(modal.js))
}

shinyApp(ui, server, options = list(launch.browser = TRUE))

这个方法不需要额外的JS代码,因为dropdown_input默认就是收起状态,和Semantic UI的模态框适配性更好。

内容的提问来源于stack exchange,提问作者6PO0222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:52:52