【问题标题】:How to add JavaScript to change CSS file in R Shiny Application如何在 R Shiny 应用程序中添加 JavaScript 以更改 CSS 文件
【发布时间】:2013-12-26 18:01:35
【问题描述】:

我正在构建一个 R Shiny 应用程序,它有时会被单独看到,有时会在另一个网页的 iframe 中查看。我想根据查看的位置有一个不同的 .css 文件,所以我需要添加一个 JavaScript 语句来选择正确的 .css。我现在拥有的是:

ui.r

headerPanel(winowTitle="PageTitle",

list(tags$head(
tags$script('type = "text/javascript",  if(window.self === window.top) {
 tags$link(rel="stylesheet", type="text/css", href="FullSite.css")} 
 else{ tags$link(rel="stylesheet", type="text/css", href="InFrame.css"})'),

  (other stuff that works)), etc

当我运行它时,应用程序可以工作,但它不会读取任何一个 .css 文件。我做错了什么?

谢谢

【问题讨论】:

  • 您在tags$script 中使用R 代码,这就是它不起作用的原因。您需要将代码中的else 部分替换为javascript

标签: javascript r shiny


【解决方案1】:

这是一种方法。我已将script 中的R 代码替换为javascript。第一行使用 javascript 中的三元运算符将样式表的值设置为适当的值。

list(tags$head(tags$script('type = "text/javascript",
  stylesheet = window.self === window.top ? "FullSite.css" : "InFrame.css"
  $("head").append("<link rel=stylesheet type=text/css href=" + stylesheet + ">") 
')))

更新:这是动态添加样式表的更好方法。我用这个SO Post 修改了我的答案。

  list(tags$head(tags$script('type = "text/javascript"', '
    var ss = document.createElement("link");
    ss.type = "text/css";
    ss.rel = "stylesheet";
    ss.href = window.self === window.top ? "FullSite.css" : "InFrame.css"
    document.getElementsByTagName("head")[0].appendChild(ss);
  ')))

【讨论】:

  • 谢谢,但这不起作用。该站点加载正常,但未使用 css 文件。当我检查网站源时,我看到:&lt;script&gt;type = "text/javascript", stylesheet = window.self === window.top ? "FullSite.css" : "InFrame.css" $("head").append("&amp;lt;link rel=stylesheet type=text/css href=" + stylesheet+ "&amp;gt;")&lt;/script&gt; 似乎没有正确读取 。
  • 啊,好吧。你需要逃离他们。尝试转义 &lt;&gt; 符号,以便它们不会分别转换为 &amp;lt&amp;gt
  • 抱歉,我对 javascript 几乎一无所知 - 我该如何逃避它们?
  • 我添加了一个替代解决方案,它应该可以在没有任何转义的情况下工作。
  • 没问题。这对我来说也是一次很好的学习经历:)
猜你喜欢
  • 2020-11-02
  • 2018-03-13
  • 1970-01-01
  • 2020-02-26
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2018-11-18
相关资源
最近更新 更多