【问题标题】:close (Chrome) browser window on navbar click导航栏上的关闭(Chrome)浏览器窗口单击
【发布时间】:2015-07-13 00:40:57
【问题描述】:

我一直在使用suggested by @wch on SO 方法在单击 Shiny 应用程序中的操作按钮时关闭浏览器窗口。效果很好。

我现在想停止我的应用程序在单击导航栏中的元素时关闭 Bowser 窗口(在 Chrome 中)。在我正在使用的 tabPanel 调用下方

tabPanel(title = "", value = "Stop", icon = icon("power-off"))

input$navbar == "Stop" 的值(即选择导航栏中的图标时)时,我使用观察者来停止应用程序,但我不确定如何激活window.close() 调用。

@wch 关闭浏览器窗口的操作按钮代码

tags$button(
  id = 'close',
  type = "button",
  class = "btn action-button",
  onclick = "window.close();",
  "Close window"
)

编辑:

找到了我想要的解决方法。

tabPanel(tags$a(id = "quitApp", href = "#", class = "action-button",
         list(icon("power-off"), ""), onclick = "window.close();"))

不幸的是,它会导致导航栏的对齐非常糟糕。我在 Shiny google 群组中询问了related question

【问题讨论】:

  • 您能否提供更多代码来拥有一个完全可重现的闪亮应用程序
  • 我提供的答案有什么问题/不足吗?
  • @daattali 我喜欢这个答案,所以我投了赞成票。但是,我更喜欢不需要包依赖项的选项。然而,这可能不可行。
  • 当然,你可以摆脱包依赖——你熟悉“session$sendCustomMessage”来调用javascript函数吗?我只使用了这个包,因为它使调用 JS 函数更容易,更不混乱,但是如果你知道如何使用它,你可以使用 sendCustomMessage 复制我的解决方案
  • @daattali 我没怎么用过 sendCustomMessage。不过,我很乐意为您提供该答案的“检查”。

标签: r shiny


【解决方案1】:

您可以使用shinyjs 包轻松调用javascript 函数,这基本上是您需要做的所有事情。免责声明:我写了那个包。这是执行您想要的操作的代码:

library(shinyjs)
jscode <- "shinyjs.closewindow = function() { window.close(); }"

runApp(shinyApp(
  ui = tagList(
    useShinyjs(),
    extendShinyjs(text = jscode),
    navbarPage(
      "test",
      id = "navbar",
      tabPanel(title = "tab1"),
      tabPanel(title = "", value = "Stop", icon = icon("power-off"))
    )
  ),
  server = function(input, output, session) {
    observe({
      if (input$navbar == "Stop") {
        js$closewindow();
        stopApp()
      }
    })
  }
))

编辑

如果你不想使用 JS 包,你可以用 native shiny 做同样的事情:

jscode <- "Shiny.addCustomMessageHandler('closeWindow', function(m) {window.close();});"

runApp(shinyApp(
  ui = tagList(
    tags$head(tags$script(HTML(jscode))),
    navbarPage(
      "test",
      id = "navbar",
      tabPanel(title = "tab1"),
      tabPanel(title = "", value = "Stop", icon = icon("power-off"))
    )
  ),
  server = function(input, output, session) {
    observe({
      if (input$navbar == "Stop") {
        session$sendCustomMessage(type = "closeWindow", message = "message")
        stopApp()
      }
    })
  }
))

【讨论】:

  • 很好的建议@daattali。我会试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多