Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.02.2015, 12:34
Кандидат Javascript-наук
Отправить личное сообщение для FanAizu Посмотреть профиль Найти все сообщения от FanAizu
 
Регистрация: 08.03.2011
Сообщений: 148

Смена темы сайта без мерцания
Скриптами я меняю значение href у тега link со стилями сайта. То есть меняю темы сайта безе перезагрузки сайта. Так вот, как только скрипт меняет href у link, то сайт становится без оформления, пока не загрузятся стили новой темы и не применятся браузером. Как избавиться от такого поведения?
Ответить с цитированием
  #2 (permalink)  
Старый 18.02.2015, 13:25
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от FanAizu
Как избавиться от такого поведения?
Например:
- грузить все стили разом
- применить некую предзагрузку
- использовать "спрайты"
Ответить с цитированием
  #3 (permalink)  
Старый 18.02.2015, 22:10
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Альтернативные таблицы стилей тут были бы очень кстати. Вот только поддержка хромает. С хромом совсем печально. Вот версия, рабочая как минимум в последних версиях IE, Firefox, Chrome:

<!DOCTYPE html>
<meta charset="utf-8" />
<link rel="stylesheet" title="Default" href="data:text/css,body%7Bbackground%3Ared%7D" />
<link rel="alternate stylesheet" title="Alternate" href="data:text/css,body%7Bbackground%3Ablue%7D" />
<script>
    function selectStyle(style) {
        var sheets = document.styleSheets;
        for (var i = 0; i < sheets.length; i++) {
            var sheet = sheets[i];
            var disabled = sheet.title !== style;
            sheet.ownerNode.disabled = !disabled; // webkit workaround
            sheet.ownerNode.disabled = sheet.disabled = disabled;
        }
    }
</script>
Test
<button onclick="selectStyle(textContent)">Default</button>
<button onclick="selectStyle(textContent)">Alternate</button>


Причем Firefox и IE предоставляют выбор темы прямо в меню браузера (появляется по Alt'у). Кроме того, IE восстанавливает последнюю выбранную тему после перезагрузки страницы.

В общем, считаю что это отлично подходит, вот только нужно протестировать в разных браузерах.

Вообще, вместо плясок с disabled мы должны использовать document.selectedStyleSheetSet = 'Имя темы'. Но это поддерживается только в Firefox. В хроме свойство есть, но оно не реагирует на запись.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 18.02.2015, 22:14
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Попробуй загружать все link, а потом менять.
Смотри, есть стили:
<link rel="stylesheet" data-default-style type="text/css" href="css/style1.css" title="Style1">
<link rel="alternate stylesheet" type="text/css" href="css/style2.css" title="Style2">
<link rel="alternate stylesheet" type="text/css" href="css/style3.css" title="Style3">
<link rel="alternate stylesheet" type="text/css" href="css/style4.css" title="Style4">
<link rel="alternate stylesheet" type="text/css" href="css/style5.css" title="Style5">
<link rel="alternate stylesheet" type="text/css" href="css/style6.css" title="Style6">
<link rel="alternate stylesheet" type="text/css" href="css/style7.css" title="Style7">
<link rel="alternate stylesheet" type="text/css" href="css/style8.css" title="Style7">

.
По умолчанию будет запускаться тот, у которого в rel нет "alternate", насколько я помню.
Потом скриптами меняешь:

var userStyle = function(styleTitle) {
	var links = document.head.querySelectorAll('link[rel~="stylesheet"][title]');
	var found = false;
	for(var i=0; i<links.length; i++) {
		links[i].disabled = true;
		if(styleTitle == links[i].getAttribute('title')) { /* слышал, что IE глючит с title у link. Поэтому getAttribute */
			links[i].disabled = false;
			found = true; 
		}
	}
	if(!found) { /* не найдено → устанавливаем тот, что по умолчанию */
		document.head.querySelector('[data-style-default]').disabled = false;
	} 
};

У меня немного по-другому, ибо ООП, но должно работать.

Последний раз редактировалось 2chan, 26.03.2015 в 18:39.
Ответить с цитированием
  #5 (permalink)  
Старый 18.02.2015, 22:25
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 2chan
link[rel*="style"]
Есть ведь link[rel~="stylesheet"]. А вообще, не проще ли юзать document.styleSheets?

В хроме работает твой код?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 18.02.2015, 22:35
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Сообщение от danik.js Посмотреть сообщение
link[rel~="stylesheet"]
Пожалуй, ты прав. Профиксил. Спасибо.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новой темы opreasm Элементы интерфейса 1 03.08.2012 12:20
передача данных из форм своего сайта в формы стороннего сайта najrobi Общие вопросы Javascript 19 15.07.2012 22:18
Смена темы на сайте xunicorn jQuery 3 06.06.2012 10:34
Новая система управления сайтом Scripto CMS deepslam Ваши сайты и скрипты 38 31.01.2011 14:55
случайная смена фона сайта на jquery Netherlandman jQuery 8 25.08.2010 03:11