【问题标题】:How to show a (modal) popup only once per user in R/Shiny?如何在 R/Shiny 中为每个用户仅显示一次(模态)弹出窗口?
【发布时间】:2021-07-13 07:52:50
【问题描述】:

我喜欢在 R/Shiny 应用程序中显示一个弹出窗口,但每个用户只显示一次(有点像 GDPR cookie 横幅)。 shinyalert 看起来不错,但它似乎不支持设置 cookie 以仅显示一次弹出窗口。我怎样才能轻松做到这一点?有没有不需要编写额外的 JavaScript 函数的实现?

【问题讨论】:

  • 试试observeEvent(input$yourvar, {... showModal()}, ignoreInit = TRUE, once = TRUE)

标签: r session cookies shiny


【解决方案1】:

您可以这样做。这个演示使用了一个名为“js-cookie”的 js 库,这是一个获取和设置 cookie 的简单 API。无需使用额外的 R 包。

library(shiny)

ui <- fluidPage(
  HTML('<script src="https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js"></script>'),
  tags$script(HTML(
    '
    $(document).on("shiny:connected", function(){
      var newUser = Cookies.get("new_user");
      if(newUser === "false") return;
      Shiny.setInputValue("new_user", true);
      Cookies.set("new_user", false);
    });
    '
  ))
)

server <- function(input, output, session) {
  observeEvent(input$new_user, {
    req(input$new_user)
    showModal(modalDialog(
      easyClose = TRUE, footer = NULL,
      h1("Welcome new user!")
    ))
  })
  
}

shinyApp(ui, server)

如果 CDN 不起作用,请使用 js-cookie github 下载的链接并将脚本替换为您的本地副本。

这里的诀窍是将信息存储在浏览器的 cookie 中。每次用户访问时,先获取cookie,然后再决定是否显示模态。

此方法只会向每个用户显示一次模态框,并且即使他们刷新浏览器,它也不会不会再次出现。

您需要打开 cookie 设置以清除当前 cookie 才能再次看到模式。这里我以 Chrome 为例。

【讨论】:

  • 这非常接近!我应该说的是模态对话框需要关闭一次(术语“接受”),因此只有在关闭对话框后才能设置cookie。这是否需要第二个 JS 函数?
  • 我使用 Shiny.addCustomMessageHandler("terms-accepted", function(value) { Cookies.set(...) })session$sendCustomMessage("terms-accepted", message = TRUE) 得到了这个工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多