Перезагрузка стилей CSS с помощью javascript
Я хочу перезагрузить все таблицы стилей CSS на html-странице через javascript, не перезагружая страницу.
Мне нужно это только при разработке, чтобы отражать изменения css, не обновляя страницу все время.
Возможное решение - добавить суффикс ?id=randomnumber
в css hrefs с javascript, но я не хочу этого делать.
Я хочу каким-то образом перезагрузить таблицу стилей, не изменяя ее url, и браузер решит, нужно ли загружать новую версию этого css или нет (если сервер отвечает с помощью 304 - Not modified
).
Как это сделать?
Ответы
Ответ 1
В простом Javascript:
var links = document.getElementsByTagName("link");
for (var x in links) {
var link = links[x];
if (link.getAttribute("type").indexOf("css") > -1) {
link.href = link.href + "?id=" + new Date().getMilliseconds();
}
}
В jQuery:
$("link").each(function() {
if $(this).attr("type").indexOf("css") > -1) {
$(this).attr("href", $(this).attr("href") + "?id=" + new Date().getMilliseconds());
}
});
Обязательно загрузите эту функцию после загрузки дерева DOM.
Ответ 2
Есть намного лучшие способы достижения:
Мне нужно это только при разработке, чтобы отражать изменения css, не обновляя страницу все время.
Один из способов - использовать Grunt.js для watch для изменений файла, а затем livereload на странице.
Рабочий процесс выглядит следующим образом:
- Сохранить документ css
- Часы Grunt видят изменение
- live перезагружает css на странице
Это можно связать с другими функциями Grunt, такими как компиляция препроцессора {sass | less | stylus}, чтобы создать рабочий процесс следующим образом:
- сохранить файл Sass
- часы видят изменения
- sass скомпилирован и уменьшен до местоположения cdn
- новый css загружается на страницу
Другие ресурсы автоматизации переднего плана:
Видео от сотрудника Google: http://www.youtube.com/watch?v=bntNYzCrzvE
http://sixrevisions.com/javascript/grunt-tutorial-01/
http://aboutcode.net/vogue/
Ответ 3
Сначала добавьте идентификатор (если нет) в теги ссылок на таблицу стилей, например:
<link id="mainStyle" rel="stylesheet" href="style.css" />
Далее, в Javascript (также используя jQuery) добавьте следующую функцию:
function freshStyle(stylesheet){
$('#mainStyle').attr('href',stylesheet);
}
Наконец, активируйте функцию на нужном событии:
$('#logo').click(function(event){
event.preventDefault();
var restyled = 'style.css';
freshStyle(restyled);
});
Обновляя значение связанной таблицы стилей, даже если это одно и то же значение, вы заставляете клиента снова смотреть; когда он это сделает, он увидит и (повторно) загрузит последний файл.
Если у вас возникли проблемы с кешем, попробуйте добавить произвольный номер версии (psuedo) к вашему файлу, например:
var restyled = 'style.css?v='+Math.random(0,10000);
Надеюсь, это поможет. Примеры Dillen выше также работают, но вы можете использовать это, если хотите просто настроить таргетинг на один или набор таблиц стилей с незначительными настройками.
Ответ 4
Это очень просто в браузере GoogleChrome.
Нажмите F12, щелкните шестерню в правом нижнем углу и выберите опцию Отключить кеш (в то время как DevTools открыт).
![enter image description here]()
![enter image description here]()
Ответ 5
Альтернативой для Grunt будет использование Prepros.
Он также использует наблюдателя файлов в папке проекта, но для всех ваших файлов. (js, css, php) и перезагружать страницу при каждом изменении. (+ Если это небольшое визуальное изменение, такое как css, оно не обновит страницу, это сделает плавный переход. (Работает для цветов, позиционирования и т.д.))
Как и Grunt, он компилирует и уменьшает ваши файлы и позволяет вам выполнять предварительный просмотр в прямом эфире по указанному URL (не только локальному хосту). (Есть много возможностей)
Используя специальный порт, он даже синхронизирует события, такие как клик, колесико мыши, входы и т.д.