simulating a click when using Shiny's downloadHandler


#1

Does
"document.getElementById('downloadData').click();"
also work with Safari 12.0?


How to stop download in downloadHandler
#2

I believe it should work on any modern broswer. Are you finding an error when you try?


#3

My question refers to Paul's (slightly adapted) solution in How to stop download in downloadHandler

library(shiny)

ui <- fluidPage(
  shinyjs::useShinyjs(),
  actionButton("init", "Download", icon = icon("download")),
  downloadButton("downloadData", "Download", style = "visibility: hidden;")
)

server <- function(input, output) {
  # Our dataset
  data <- mtcars
  
  observeEvent(input$init, {
      shinyjs::runjs("document.getElementById('downloadData').click();")
  })
  
  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(data, file)
    }
  )
}

shinyApp(ui, server)

My point is that Safari with the recently released version 12.0 (perhaps for safety reasons) no longer seems to support .click() when it leads to a download, while other browsers like chrome and firefox still do.

My workaround is

library(shiny)

ui <- fluidPage(
  shinyjs::useShinyjs(),
  actionButton("init", "Download", icon = icon("download")),
  downloadButton("downloadData", "Download", style = "visibility: hidden;")
)

server <- function(input, output) {
  # Our dataset
  data <- mtcars
  
  shinyjs::runjs("document.getElementById('init').addEventListener('click',function(){  
    setTimeout(function(){document.getElementById('downloadData').click();},800)
                 });") 
  
  observeEvent(input$init, {
      shinyjs::runjs("document.getElementById('init').addEventListener('click',function(){  
    setTimeout(function(){document.getElementById('downloadData').click();},800)
                 });") 
  })
  
  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(data, file)
    }
  )
}

shinyApp(ui, server)