R语言 我怎样使聚焦的元素发光?

4xrmg8kj  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(118)

有没有办法在shiny中找出焦点是否在文本字段(或者选择字段)上?
我的网站有很多元素,如图,表,数字输入和按钮。
目前我有这样的东西:

library(shiny)
ui <- fluidPage(
  tags$script('$(document).ready(function(){ $("*").focus( function(e){ Shiny.setInputValue("focusedElement", e.target.id);}); }); '),
  textOutput("output1"),
  textInput(inputId = "text1", label = 'Text1', value = ""),
  numericInput(inputId = 'num1',label = 'Num1', value=5),
  selectInput(inputId = 'select1', label='Select1',choices = c(1,2,3)),
  plotOutput('plot'),
  actionButton('btn','Btn'),
  DT::dataTableOutput('table'),
  
)

server <- function(input, output, session) {
  output$output1 <- renderText({ 
    print(input$focusedElement)
    input$focusedElement })
  output$table<- DT::renderDataTable(iris)
  output$plot<-renderPlot(plot(iris[,c(3,4)]))
}

shinyApp(ui, server)

虽然我关注了每一个输入和空白的背景,但唯一有效的是文本输入,数字输入和按钮。这是为什么?(看看控制台的输出,select1在某个点上肯定是关注的,但从来没有打印出来,还有搜索栏,情节和背景。)

请随意提出完全不同的方法或纠正我的风格。
最后我想知道的实际上只是我现在是在一个文本字段(如text1num1或表的搜索栏)还是一个按钮中。

cuxqih21

cuxqih211#

这可能是因为被聚焦的元素是option元素,而不是select元素本身。
在onFocus选项的帮助下,您可以使用selectizeInput触发焦点上的内容。

library(shiny)

js <- "function() {
  Shiny.setInputValue('focus', true, {priority: 'event'});
}"

ui <- fluidPage(
  selectizeInput(
    "ID", "LABEL", 
    choices = list("A", "B", "C"),
    options = list(
      onFocus = I(js)
    )
  )
)

server <- function(input, output, session) {
  observeEvent(input[["focus"]], {
    showNotification("FOCUS!!!")
  })
}

shinyApp(ui, server)

编辑

还有onBlur选项,一个在焦点丢失时执行的函数,所以你可以这样做:

onFocus <- "function() {
  Shiny.setInputValue('focus', 'SELECT');
}"
onBlur <- "function() {
  Shiny.setInputValue('focus', null);
}"

ui <- fluidPage(
  selectizeInput(
    "ID", "LABEL", 
    choices = list("A", "B", "C"),
    options = list(
      onFocus = I(onFocus), onBlur = I(onBlur)
    )
  )
)

对您感兴趣的其他小部件执行类似的操作,这样,Shiny变量input$focus将始终设置为您感兴趣的小部件中当前聚焦的元素,如果没有聚焦的元素,则设置为NULL

相关问题