Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   смена CSSна сайте в зависимости от дня недели (https://javascript.ru/forum/dom-window/13723-smena-cssna-sajjte-v-zavisimosti-ot-dnya-nedeli.html)

dac_60 10.12.2010 21:35

смена CSSна сайте в зависимости от дня недели
 
Доброго всем.

Признаюсь честно в Javascript полный ноль, но постала потребность сделать смену CSS на сайте в зависимости от дня недели.

Подскажите как сделать чтоб изменялся файл CSS взависимости от того какой сегодня день (пн, вт, и т. д.)?

ksa 10.12.2010 21:38

Цитата:

Сообщение от dac_60
как сделать чтоб изменялся файл CSS взависимости от того какой сегодня день (пн, вт, и т. д.)?

Т.е. как сменить сам ЦСС-файл ты уже вкурсе?

А вот как узнать день недели...
http://javascript.ru/forum/misc/9390...en-nedeli.html

dac_60 10.12.2010 21:39

ksa,
если только ручками в шаблоне :), а так то нет.

ksa 10.12.2010 21:42

dac_60, серверный язык каккой?

dac_60 10.12.2010 21:59

вообще то кмс стоит DLE

ksa 10.12.2010 22:07

Если есть серверный язык - можно сделать цсс-файлы такого типа

f0.css
f1.css
...
f6.css


тогда при генерации хтмля можно использовать нечто подобное

<link rel="stylesheet" type="text/css" href="f#($h#7)#.css">


Пример на csp...

dac_60 10.12.2010 22:30

ksa,
на csp - не работает.

я думаю что лучше на javascript это сделать

monolithed 10.12.2010 23:12

Цитата:

Сообщение от ksa
f#($h#7)#

боюсь даже спросить что это? :)

dac_60 откроете файл main.tpl, найдете файл, который отвечает у вас за стили, замените на код ниже, но перед этим создайте в каталоге шаблона css 7 файлов css с названиями style1, style2 и тд:


<?php
$i = 0;
$array = array();
while($i++<7){
	array_push($array, $i);
}
?>

<link rel="stylesheet" type="text/css" href="{THEME}/css/style<?php echo $array[date("w",time())].'.css'; ?>" />

kadabrik 10.12.2010 23:12

Функция для динамической подгрузки*:

<script>
function loadjscssfile(filename, filetype){
 if (filetype=="js"){ //if filename is a external JavaScript file
  var fileref=document.createElement('script')
  fileref.setAttribute("type","text/javascript")
  fileref.setAttribute("src", filename)
 }
 else if (filetype=="css"){ //if filename is an external CSS file
  var fileref=document.createElement("link")
  fileref.setAttribute("rel", "stylesheet")
  fileref.setAttribute("type", "text/css")
  fileref.setAttribute("href", filename)
 }
 if (typeof fileref!="undefined")
  document.getElementsByTagName("head")[0].appendChild(fileref)
}
</script>

*взято отсюда

ее вставить в HEAD.
Подключать таблицу стилей вызовом:

loadjscssfile("путь_к_файлу.css", "css");

получить день недели можно c помощью метода day объекта Date

monolithed 10.12.2010 23:26

kadabrik ну зачем всякий сусор из сети нести, можно гораздо проще, по аналогии с примером выше на PHP:

<script type="text/javascript">
window.onload = function(){
    var i = 0, array = [];
    while(i++<7){
        array.push(i);
    }
    document.getElementsByTagName('link')[0].setAttribute('href', 'style'+array[new Date().getDay()]+'.css');
};
</script>


dac_60, только номер элемента не забудьте поменять или же ничего не нужно менять если файл будет стоять первым.

castor 10.12.2010 23:26

new Date().getDay()
Только 0 соответствует вс.
Если нужно привести к виду пн - 0, вт - 1, ..., вс - 6, то так:
(new Date().getDay() + 6) % 7

Ну и вместо генерации аж 7(!) файлов есть работа со стилями
document.styleSheets - массив таблиц
addRule(), insertRule() - методы конкретной таблицы (для IE и остальных)

Плюс - не нужно отдельных запросов, все делается в одном скрипте.

Цитата:

c помощью метода day объекта Date
Нет такого метода. Есть getDay().

monolithed 10.12.2010 23:48

Цитата:

Сообщение от castor
Только 0 соответствует вс.

в конкретном случае не важно

Цитата:

Сообщение от castor
Ну и вместо генерации аж 7(!)

А если нужно менять полностью стиль страницы?

Цитата:

Сообщение от castor
document.styleSheets - массив таблиц
addRule(), insertRule() - методы конкретной таблицы (для IE и остальных)

addRule(), insertRule() - IE, Safari 4.0+, Chrome 4+

Цитата:

Сообщение от castor
Плюс - не нужно отдельных запросов, все делается в одном скрипте.

А кто спорит


Самый простой способ менять стиль элемента в зависимости от дня недели:
<script type="text/javascript">
window.onload = function(){
    var array = ['#DC1C1C', '#1CCCDC', '#1CDC6C', '#425C4D', '#B8DC00', '#DC00B6', '#A2A2A2'];
    document.getElementsByTagName('div')[0].style.background = array[new Date().getDay()];
};
</script>
<div style="width: 200px; height: 200px;"></div>

рони 11.12.2010 11:03

monolithed, интересно это зачем? )))
<script type="text/javascript">
window.onload = function(){
    var array = ['#DC1C1C', '#1CCCDC', '#1CDC6C', '#425C4D', '#B8DC00', '#DC00B6', '#A2A2A2'], i = array.length;
*!*
   while(i--){
        array.push(i);
    }
*/!*
    document.getElementsByTagName('div')[0].style.background = array[new Date().getDay()];
};
</script>
<div style="width: 200px; height: 200px;"></div>

monolithed 11.12.2010 11:41

рони, ага тупанул что-то (с предыдущих примеров осталось)))

x-yuri 11.12.2010 11:50

я считаю, самый оптимальный вариант - на сервере назначать body нужный класс(mon, tue, wed...), а в css переопределять нужные свойства в зависимости от наличия того или иного класса. Таким образом, не размазываем css по html и имеем разные значения свойств друг возле друга:
.mon div {
    background: red;
}
.tue div {
    background: green;
}
.wed div {
    background: blue;
}

Sweet 11.12.2010 12:01

Цитата:

Сообщение от monolithed
с предыдущих примеров осталось

Так а тут зачем цикл? Не проще просто инициализировать весь массив, там же не так много элементов:
<script type="text/javascript">
window.onload = function(){
    document.getElementsByTagName('link')[0].setAttribute('href', 'style'+[0,1,2,3,4,5,6][new Date().getDay()]+'.css');
};
</script>

Sweet 11.12.2010 12:08

А, вообще, думаю, что это не лучшая идея, загружать страницу, а потом перерисовывать ее, подгружая цсс:)

Aetae 11.12.2010 16:49

Цитата:

Сообщение от Sweet (Сообщение 83304)
А, вообще, думаю, что это не лучшая идея, загружать страницу, а потом перерисовывать ее, подгружая цсс:)

Можно по-старинке)) :
<script type="text/javascript">document.write('<link rel="stylesheet" href="style_' + new Date().getDay() + '.css">')</script>


А вообще - решение по-любому надо делать на серваке.

castor 11.12.2010 16:58

Цитата:

Можно по-старинке))
Это вообще-то называется "через ж..у". Писать в body style или link - как же непрофессионализм достал.
Цитата:

А вообще - решение по-любому надо делать на серваке.
А вообще - решение зависит от конкретных условий. Так что вовсе не по-любому.

Sweet 11.12.2010 17:32

Цитата:

Сообщение от castor
Писать в body style или link

А кто говорил про body? Имелось ввиду как раз наоборот, делать document.write именно в head

castor 11.12.2010 17:52

Цитата:

Имелось ввиду как раз наоборот, делать document.write именно в head
Безграмотность процветает... А посмотреть результат такой записи в дереве с помощью любого браузера в лом?

Что-то записать в head можно, только полностью переписав весь документ. Вместе с html, head и body. RTFM.

Sweet 11.12.2010 18:05

Цитата:

Сообщение от castor
Вместе с html, head и body

О каком body идет речь? Такого элемента еще нет:)
<html>
  <head>
    <script type="text/javascript">
    document.write('<link rel="stylesheet" href="style_' + new Date().getDay() + '.css">');
    </script>
  </head>
  <body></body>
</html>

x-yuri 11.12.2010 19:13

Цитата:

Сообщение от castor
А вообще - решение зависит от конкретных условий. Так что вовсе не по-любому.

спасибо Кэп, но в данном конкретном случае - лучше на сервере

Aetae 11.12.2010 22:29

Цитата:

Сообщение от castor (Сообщение 83365)
Безграмотность процветает... А посмотреть результат такой записи в дереве с помощью любого браузера в лом?

Во-во, процветает. Вы как учёный отказывающийся от дедовских методов, только потому, что они дедовские, не удосужившись на них даже взглянуть, не то что понять.

На всякий если ещё не дошло:
<html>
  <head>
    <script type="text/javascript">
    document.write('<link rel="stylesheet" href="style_' + new Date().getDay() + '.css">');
    alert('A где же наше body? Посмотрим: ' + document.body)
    </script>
  </head>
  <body>
    <h1>А вот и body!</h1>
  </body>
</html>

Kolyaj 11.12.2010 23:03

Вобщем-то можно даже так
<html><head>
<script type="text/javascript">document.write('</head>');</script>
<body></body>
</html>

castor 12.12.2010 02:31

не удосужившись на них даже взглянуть, не то что понять

Да, парсеры нынче правильно разбирают, куда какие элементы вставлять в дерево. Тут я не прав. Раньше ситуация была куда как хуже - все добавлялось в body.

Цитата:

если ещё не дошло
Тем не менее, подозреваю, что вы совсем не понимаете, как работает document.write(), да и document.open() вместе с document.close().

Смотрим
<html>
<head>
<script type="text/javascript">
document.write('<link rel="stylesheet" href="test.css">');
document.write('<h1>Ой, а куда меня добавят? Неужто в head?</h1>');
</script>
</head>
<body></body>
</html>


Метод document.write() передает нераспарсенный текст. Кому? Парсеру, конечно. На этом этапе никакого дерева еще нет и быть не может. Потому и обращение к document.body тут абсолютно не при чем.

Aetae 12.12.2010 03:56

Цитата:

Сообщение от castor (Сообщение 83430)
Метод document.write() передает нераспарсенный текст. Кому? Парсеру, конечно. На этом этапе никакого дерева еще нет и быть не может.

...что собсно я и пытался сказать.

ksa 12.12.2010 09:26

Цитата:

Сообщение от dac_60
на csp - не работает.

У тебя на сервере установлено и настроено Cache? :D

Цитата:

Сообщение от monolithed
боюсь даже спросить что это?

Таки уже спросил... :)
Это вставка COS (Каше Обжект Скрипт) в хтмл...
#(...)#

Это дата в формате хоролог <количество_дней_с_1800_года>,< количество_секунд_с_полуно и>
$h
Это бинарная операция остаток от деления N на M
N#M

Возможно там придется прибавить что-то для коррекции дня недели но это уже не принципиально...

Kolyaj 12.12.2010 14:26

Цитата:

Сообщение от castor
Метод document.write() передает нераспарсенный текст. Кому? Парсеру, конечно. На этом этапе никакого дерева еще нет и быть не может. Потому и обращение к document.body тут абсолютно не при чем.

Но он таки парсится в процессе.
<html><head></head>
<body id="body_id">
    <script type="text/javascript">document.write(document.body.id);</script>
</body></html>

Sweet 12.12.2010 15:05

Цитата:

Сообщение от castor
Что-то записать в head можно, только полностью переписав весь документ.

Цитата:

Сообщение от castor
На этом этапе никакого дерева еще нет и быть не может.

castor, вы начинаете путаться в показаниях:) Это, видимо, происходит потому, что вы отвечаете на сообщения "не удосужившись на них даже взглянуть, не то что понять":p


Часовой пояс GMT +3, время: 14:52.