使用 Shiny `renderUI` 时无法 运行 JavaScript 编码
Cannot run JavaScript code when Shiny `renderUI` is used
我正在尝试将 JS 脚本('Select all' 框)应用于动态呈现的 UI,但以下操作不起作用:
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
uiOutput("checkbox_ui")
)
server <- function(input, output, session) {
output$checkbox_ui <- renderUI({
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
})
runjs(HTML("
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
"))
}
shinyApp(ui, server)
但是,当我跳过使用 renderUI
时,JS 脚本是 运行:
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
)
server <- function(input, output, session) {
runjs(HTML("
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
"))
}
shinyApp(ui, server)
有人知道解决方法吗?
那是因为runjs
执行的时候checkbox还没有渲染。
我会尝试:
runjs(HTML("setTimeout(function(){
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
});"))
如果不行,我会试试
observeEvent(input[["myCheckbox"]], {
runjs(HTML("
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
"))
})
编辑
这是一个可行的解决方案,没有使用 shinyjs
:
library(shiny)
js <- paste(
"$(document).ready(function(){",
" $('body').on('click', \"#myCheckbox input[value='All']\", function(e) {",
" var isChecked = $(e.target).prop('checked');",
" $(\"#myCheckbox input[value!='All']\").prop('checked', isChecked);",
" });",
"});",
sep = "\n"
)
ui <- fluidPage(
tags$head(tags$script(HTML(js))),
uiOutput("checkbox_ui")
)
server <- function(input, output, session) {
output$checkbox_ui <- renderUI({
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
})
}
shinyApp(ui, server)
以下工作正常。
js <- "
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
"
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
)
server <- function(input, output, session) {
observeEvent(input[["myCheckbox"]], {
updateCheckboxGroupInput(session,"myCheckbox")
runjs(HTML(js))
}, ignoreNULL = FALSE)
}
shinyApp(ui, server)
与renderUI
ui <- fluidPage(
useShinyjs(),
uiOutput("uic")
)
server <- function(input, output, session) {
output$uic <- renderUI({
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
})
observeEvent(input[["myCheckbox"]], {
updateCheckboxGroupInput(session,"myCheckbox")
runjs(HTML(js))
}, ignoreNULL = FALSE)
}
shinyApp(ui, server)
我正在尝试将 JS 脚本('Select all' 框)应用于动态呈现的 UI,但以下操作不起作用:
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
uiOutput("checkbox_ui")
)
server <- function(input, output, session) {
output$checkbox_ui <- renderUI({
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
})
runjs(HTML("
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
"))
}
shinyApp(ui, server)
但是,当我跳过使用 renderUI
时,JS 脚本是 运行:
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
)
server <- function(input, output, session) {
runjs(HTML("
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
"))
}
shinyApp(ui, server)
有人知道解决方法吗?
那是因为runjs
执行的时候checkbox还没有渲染。
我会尝试:
runjs(HTML("setTimeout(function(){
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
});"))
如果不行,我会试试
observeEvent(input[["myCheckbox"]], {
runjs(HTML("
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
"))
})
编辑
这是一个可行的解决方案,没有使用 shinyjs
:
library(shiny)
js <- paste(
"$(document).ready(function(){",
" $('body').on('click', \"#myCheckbox input[value='All']\", function(e) {",
" var isChecked = $(e.target).prop('checked');",
" $(\"#myCheckbox input[value!='All']\").prop('checked', isChecked);",
" });",
"});",
sep = "\n"
)
ui <- fluidPage(
tags$head(tags$script(HTML(js))),
uiOutput("checkbox_ui")
)
server <- function(input, output, session) {
output$checkbox_ui <- renderUI({
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
})
}
shinyApp(ui, server)
以下工作正常。
js <- "
$(\"#myCheckbox input[value='All']\").click(function(e) {
$(\"#myCheckbox input[type='checkbox']\").prop('checked', $(e.target).prop(\"checked\"));
});
"
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
)
server <- function(input, output, session) {
observeEvent(input[["myCheckbox"]], {
updateCheckboxGroupInput(session,"myCheckbox")
runjs(HTML(js))
}, ignoreNULL = FALSE)
}
shinyApp(ui, server)
与renderUI
ui <- fluidPage(
useShinyjs(),
uiOutput("uic")
)
server <- function(input, output, session) {
output$uic <- renderUI({
checkboxGroupInput(inputId = "myCheckbox",
label = NULL,
choices = c("All", "A", "B"))
})
observeEvent(input[["myCheckbox"]], {
updateCheckboxGroupInput(session,"myCheckbox")
runjs(HTML(js))
}, ignoreNULL = FALSE)
}
shinyApp(ui, server)