Откройте консоль (Ctrl + Shift + i с Chrome), вы увидите, что в вашем коде JS есть некоторые ошибки.
Основная из них в том, что shiny
еще не готов когда вы открываете приложение, поэтому функция Shiny.setInputValue
не найдена.
Чтобы быть уверенным, что shiny
готово, используйте:
$(document).on("shiny:connected", function(){
......
});
Теперь, после нескольких испытаний, я обнаружил, что элемент, который должен быть «сфокусирован», - это не весь элемент select
. Это его div
подэлемент с классом selectize-input
, который вы можете выбрать с помощью $("#select ~ .selectize-control > .selectize-input")
.
Наконец, хорошее действие для выполнения - это не focus
, а click
. Вот полное приложение:
library(shiny)
js <- '
$(document).on("shiny:connected", function(){
alert("Loaded");
Shiny.setInputValue("loaded", 1);
Shiny.addCustomMessageHandler("focus", function(x){
$("#select ~ .selectize-control > .selectize-input").click();
});
});
'
ui <- fluidPage(
tags$head(tags$script(HTML(js))),
headerPanel("Focus", windowTitle = "Focus"),
fluidRow(
column(width = 2, class = "panel",
selectInput("select", label = "Your Choice",
choices = c("Choice 1", "Choice 2"), selectize = TRUE),
actionButton("click", "Click")
),
column(width = 10,
textOutput("text")
)
)
)
server = function(input, output, session) {
observeEvent(input$loaded, {
session$sendCustomMessage("focus", list(NULL))
print("Loaded")
})
observeEvent(input$select, {
print("Selected")
})
observeEvent(input$click, {
session$sendCustomMessage("focus", list(NULL))
print("Clicked")
})
output$text <- renderText({
})
}
shinyApp(ui = ui, server = server)