0

我正在使用javascript这个问题的一部分:SO

它适用于按钮,但我也想禁用sliderInput,之类的selectInput东西textInput

textinput我试图用禁用字段的“输入”替换“按钮” 。我想知道是否有一种方法可以一次性禁用所有元素。

更大的问题如下:当您打开 时dropdownbutton,关闭按钮通常应该删除modal dialog,以防 javascript 标记从下面的演示应用程序中删除。但是,当脚本在应用程序中时,关闭按钮由于某种原因不再起作用。它仍然打印文本命令,这意味着它被观察到了,但模式没有关闭。对话框中的另一个按钮仍然正常工作。

应用程序:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  h3('Disable buttons while running'),
  actionButton('btn_run','Run long process'),
  hr(),
  h3('Inputs'),
  actionButton('btn1','Button 1'),
  hr(),
  textInput('text1', 'Text1',"my text:"),
  hr(),
  selectInput('select1', 'Selectinput', choices = c('A', 'B', 'C'), selected = 'A'),
  hr(),
  h5('Dropdown'),
  dropdownButton(inputId = "MyDropDown",
                 h3("This is a dropdown"),
                 actionButton('btn_run2','Run other long process'),
                 fluidRow(actionButton( "CloseDropDown", "Close"), style = "float: right; margin-right:10px"),
                 icon = icon("tasks"),
                 tooltip = tooltipOptions(title = "Click to open"), width = "500px"),
  hr(),
  sliderInput('slid3','Slider 1',min=0,max=1,value=0.5),


tags$script(HTML("$(document).on('shiny:busy', function() {
  var inputs = document.getElementsByTagName('button');
console.log(inputs);
for (var i = 0; i < inputs.length; i++) {
inputs[i].disabled = true;
}
});

$(document).on('shiny:idle', function() {
var inputs = document.getElementsByTagName('button');
console.log(inputs);
for (var i = 0; i < inputs.length; i++) {
inputs[i].disabled = false;
}
})" ))
)

server <- function(input, output, session){

  observeEvent(input$btn_run,{
    Sys.sleep(5)
  })


  observeEvent(input$btn_run2,{
    Sys.sleep(5)
  })

  observeEvent(input$CloseDropDown, {print('closing?')
    toggleDropdownButton(inputId = 'MyDropDown') })

}

shinyApp(ui = ui, server = server)
4

1 回答 1

1

我无法为您提供关闭按钮,尽管我发现一旦您设置了shiny:idle句柄,任何对 JavaScript 的调用都会触发shiny:idle,因此会运行处理程序而不是后面的 JavaScript 代码toggleDropdownButton

但是,如何在 JavaScript 中选择多个元素的第一个问题可以通过一些jQuery. 将您的代码更改为

$(document).on('shiny:busy', function() {
  var $inputs = $('button,input');
console.log($inputs);
$inputs.prop('disabled', true);
});

$(document).on('shiny:idle', function() {
var $inputs = $('button,input');
console.log($inputs);
$inputs.prop('disabled', false);
})

有了它,您可以选择按钮和文本输入。现在您可以自己找出要使用哪些代码来禁用下拉菜单。

顺便说一句:也许你想看看shinyjs::disable. 使用此功能,您可以从R侧面禁用您的控件。您可以将其放在长时间计算的开头并shinyjs::enable在最后使用。

于 2018-09-14T14:55:16.387 回答