javascript - Shiny忙时禁用元素
问题描述
我正在使用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)
解决方案
我无法为您提供关闭按钮,尽管我发现一旦您设置了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
在最后使用。
推荐阅读
- r - 在R中的lubridate中将数据转换为日期、月份、年份
- javascript - 如何突出显示 Plottly 图形标记
- python - Python Regex(模式匹配)电话号码以区号搜索开头
- node.js - 如何在我的 nodejs 应用程序中使用 CORS 修复此错误
- python - 我正在使用 django 创建一个日历应用程序。日历必须是垂直的
- vb.net - 为所有检索到的元素提取属性值
- java - 使用重绘时它看起来像这样,为什么?
- linux - egrep 命令查找长度为 3 的倍数的子字符串
- excel - 无法在 Excel 中保存下一条记录的数据。第一个被覆盖。我正在使用 Tkinter 将数据附加到数据框,然后添加到 excel
- java - 为什么在 Double 中添加了指数科学计数法