Можно ли добавить "Вы уверены, что хотите покинуть эту страницу?" закрыть сообщение для Shiny App, когда браузер будет закрыт?

К сожалению, я не могу найти ответ в другом месте на StackExchange. Я думаю, что вы можете сделать это с помощью JavaScript, хотя я не очень знаком с этим. Большое спасибо заранее.

3
user2243322 30 Май 2019 в 02:31

2 ответа

Лучший ответ

Самый простой способ добиться этого - использовать window.onbeforeunload в JavaScript.

Код из принятого ответа в другом тема Stackoverflow:

window.onbeforeunload = function() {
  return 'Your changes will be lost!';
};

Вы можете реализовать это (и любой код JavaScript), включив его в fluidPage для приложений Shiny или dashboardBody для страниц Shiny.

Код JavaScript должен быть заключен в теги head и script (как при включении файла JS в HTML)

Решение:

tags$head(tags$script(HTML("
    // Enable navigation prompt
    window.onbeforeunload = function() {
        return 'Your changes will be lost!';
    };
"))),

Воспроизводимый пример для приложения Geyser по умолчанию:

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(
    # Navigation prompt
    tags$head(tags$script(HTML("
        // Enable navigation prompt
        window.onbeforeunload = function() {
            return 'Your changes will be lost!';
        };
    "))),
    # Application title
    titlePanel("Old Faithful Geyser Data"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            sliderInput("bins",
                        "Number of bins:",
                        min = 1,
                        max = 50,
                        value = 30)
        ),

        # Show a plot of the generated distribution
        mainPanel(
           plotOutput("distPlot")
        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

    output$distPlot <- renderPlot({
        # generate bins based on input$bins from ui.R
        x    <- faithful[, 2]
        bins <- seq(min(x), max(x), length.out = input$bins + 1)

        # draw the histogram with the specified number of bins
        hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })
}

# Run the application 
shinyApp(ui = ui, server = server)
2
GyD 4 Июн 2019 в 14:21

С некоторыми Jquery / JS вы можете сделать это:

Я нашел следующее на:

https://www.oodlestechnologies.com/blogs/Capture-Browser-Or-Tab-Close-Event-Jquery-Javascript/

    var validNavigation = false;
    function wireUpWindowUnloadEvents() {
     /*
     * List of events which are triggered onbeforeunload on IE
     * check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
     */

     // Attach the event keypress to exclude the F5 refresh
     $(document).on('keypress', function(e) {
       if (e.keyCode == 116){
         validNavigation = true;
       }
     });

     // Attach the event click for all links in the page
     $(document).on("click", "a" , function() {
       validNavigation = true;
     });

     // Attach the event submit for all forms in the page
     $(document).on("submit", "form" , function() {
       validNavigation = true;
     });

     // Attach the event click for all inputs in the page
     $(document).bind("click", "input[type=submit]" , function() {
       validNavigation = true;
     });

     $(document).bind("click", "button[type=submit]" , function() {
       validNavigation = true;
     });

    }



    function windowCloseEvent()
           {
            window.onbeforeunload = function() {
             if (!validNavigation){
              callServerForBrowserCloseEvent();
             }
            }
           }



    function callServerForBrowserCloseEvent()
    {
     alert("Are you sure you want to close this window?");
    // Or you could call a bootstrap modal here and give it yes/no buttons
    }

0
MAB 29 Май 2019 в 23:45