2013-12-09 1 views
2

Я создаю приложение R Shiny, которое иногда будет видно как стоящее отдельно, а иногда будет отображаться в iframe на другой веб-странице. Я хотел бы иметь другой .css-файл в зависимости от того, где он просматривается, поэтому мне нужно добавить инструкцию JavaScript, чтобы выбрать правильный .css. Что у меня сейчас есть:Как добавить JavaScript для изменения файла CSS в R Shiny Application

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-файл. Что я делаю не так?

Спасибо

+0

Вы используете код R в 'tags $ script', поэтому это не работает. Вам нужно заменить часть 'else' кода на' javascript'. – Ramnath

ответ

5

Вот один из способов сделать это. Я заменил код R в script на 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); 
    '))) 
+0

Спасибо, но это не работает. Сайт загружается нормально, но файлы css не используются. Когда я проверяю источник сайта, я вижу: ' 'Кажется, что < and > не являются читайте правильно. –

+0

Ах ладно. Вам нужно убежать от них. Попробуйте избежать знаков '<' and '>', чтобы они не были преобразованы в' & lt' и '& gt; соответственно. – Ramnath

+0

Извините, я почти ничего не знаю о javascript - как мне их избежать? –