Как загрузить CSS файлы с помощью Javascript?
можно ли импортировать таблицы стилей css в html-страницу с помощью Javascript? Если да, то как это можно сделать?
P. S javascript будет размещен на моем сайте, но я хочу, чтобы пользователи могли вставлять <head> тег их веб-сайта, и он должен иметь возможность импортировать файл css, размещенный на моем сервере, в текущую веб-страницу. (и файл css, и файл javascript будут размещены на моем сервере).
15 ответов:
вот" старая школа " способ сделать это, который, надеюсь, работает во всех браузерах. В теории, вы бы использовали
setAttributeк сожалению, IE6 не поддерживает его последовательно.var cssId = 'myCss'; // you could encode the css path itself to generate id.. if (!document.getElementById(cssId)) { var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.id = cssId; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = 'http://website.com/css/stylesheet.css'; link.media = 'all'; head.appendChild(link); }этот пример проверяет, был ли CSS уже добавлен, поэтому он добавляет его только один раз.
поместите этот код в файл javascript, попросите конечного пользователя просто включить javascript и убедитесь, что путь CSS является абсолютным, поэтому он загружается из вашего сервера.
VanillaJS
вот пример, который использует простой JavaScript для вставки ссылки CSS в
headэлемент на основе имени файла части URL:<script type="text/javascript"> var file = location.pathname.split( "/" ).pop(); var link = document.createElement( "link" ); link.href = file.substr( 0, file.lastIndexOf( "." ) ) + ".css"; link.type = "text/css"; link.rel = "stylesheet"; link.media = "screen,print"; document.getElementsByTagName( "head" )[0].appendChild( link ); </script>вставьте код непосредственно перед закрытием
headтег и CSS будут загружены перед отображением страницы. Использование внешнего JavaScript (.js) файл вызовет вспышку неустановленного содержимого (FOUC), чтобы появиться.
Если вы используете jquery:
$('head').append('<link rel="stylesheet" type="text/css" href="style.css">');
Я думаю, что-то вроде этого скрипта будет делать:
<script type="text/javascript" src="/js/styles.js"></script>этот JS файл содержит следующее заявление:
if (!document.getElementById) document.write('<link rel="stylesheet" type="text/css" href="/css/versions4.css">');адрес javascript и css должен быть абсолютным, если они должны ссылаться на ваш сайт.
многие методы импорта CSS обсуждаются в этом "Скажи нет CSS хаки с методами ветвления" статьи.
но " использование JavaScript для динамического добавления CSS портлета таблицы стилей" в статье упоминается также возможность CreateStyleSheet (собственный метод для IE):
<script type="text/javascript"> //<![CDATA[ if(document.createStyleSheet) { document.createStyleSheet('http://server/stylesheet.css'); } else { var styles = "@import url(' http://server/stylesheet.css ');"; var newSS=document.createElement('link'); newSS.rel='stylesheet'; newSS.href='data:text/css,'+escape(styles); document.getElementsByTagName("head")[0].appendChild(newSS); } //]]>
вызовите следующую функцию для динамической загрузки файла CSS или JavaScript.
function loadjscssfile(filename, filetype) { if (filetype == "js") { //if filename is a external JavaScript file // alert('called'); var fileref = document.createElement('script') fileref.setAttribute("type", "text/javascript") fileref.setAttribute("src", filename) alert('called'); } 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) }передать полный путь к файлу с именем как
Я знаю, что это довольно старая нить, но вот мои 5 центов.
есть еще один способ сделать это в зависимости от того, что ваши потребности.
У меня есть случай, когда я хочу, чтобы css-файл был активен только некоторое время. Как переключение css. Активируйте css, а затем после другого события деативируйте его.
вместо того, чтобы загружать css динамически, а затем удалять его, вы можете добавить класс / идентификатор перед всеми элементами в новом css, а затем просто переключить этот класс / идентификатор базовый узел вашего css (например, тег body).
вы бы с этим решением имели больше css-файлов, первоначально загруженных, но у вас есть более динамичный способ переключения CSS-макетов.
Если вы хотите знать (или ждать), пока сам стиль не загрузил это работает:
// this will work in IE 10, 11 and Safari/Chrome/Firefox/Edge // add ES6 poly-fill for the Promise, if needed (or rewrite to use a callback) let fetchStyle = function(url) { return new Promise((resolve, reject) => { let link = document.createElement('link'); link.type = 'text/css'; link.rel = 'stylesheet'; link.onload = function() { resolve(); console.log('style has loaded'); }; link.href = url; let headScript = document.querySelector('script'); headScript.parentNode.insertBefore(link, headScript); }); };
существует общий плагин jquery, который загружает файлы css и JS synch и asych по требованию. Он также отслеживает то, что уже было загружено :) смотрите: http://code.google.com/p/rloader/
вот способ с помощью метода создания элемента jQuery (мои предпочтения) и с обратным вызовом
onLoad:var css = $("<link>", { "rel" : "stylesheet", "type" : "text/css", "href" : "style.css" })[0]; css.onload = function(){ console.log("CSS IN IFRAME LOADED"); }; document .getElementsByTagName("head")[0] .appendChild(css);
The Юи библиотека может быть то, что вы ищете. Он также поддерживает кросс-доменную загрузку.
Если вы используете jquery,плагин делает то же самое.
используйте этот код:
var element = document.createElement("link"); element.setAttribute("rel", "stylesheet"); element.setAttribute("type", "text/css"); element.setAttribute("href", "external.css"); document.getElementsByTagName("head")[0].appendChild(element);
вы можете использовать для этого Юи библиотека или использовать этот статьи для реализации
ниже полный код, используемый для загрузки JS и / или CSS
function loadScript(directory, files){ var head = document.getElementsByTagName("head")[0] var done = false var extension = '.js' for (var file of files){ var path = directory + file + extension var script = document.createElement("script") script.src = path script.type = "text/javascript" script.onload = script.onreadystatechange = function() { if ( !done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete") ) { done = true script.onload = script.onreadystatechange = null // cleans up a little memory: head.removeChild(script) // to avoid douple loading } }; head.appendChild(script) done = false } } function loadStyle(directory, files){ var head = document.getElementsByTagName("head")[0] var extension = '.css' for (var file of files){ var path = directory + file + extension var link = document.createElement("link") link.href = path link.type = "text/css" link.rel = "stylesheet" head.appendChild(link) } } (() => loadScript('libraries/', ['listen','functions', 'speak', 'commands', 'wsBrowser', 'main'])) (); (() => loadScript('scripts/', ['index'])) (); (() => loadStyle('styles/', ['index'])) ();
элемент.insertAdjacentHTML имеет очень хорошую поддержку браузера, и может добавить таблицу стилей в одной строке.
document.getElementsByTagName("head")[0].insertAdjacentHTML( "beforeend", "<link rel=\"stylesheet\" href=\"path/to/style.css\" />");
var fileref = document.createElement("link") fileref.setAttribute("rel", "stylesheet") fileref.setAttribute("type", "text/css") fileref.setAttribute("th:href", "@{/filepath}") fileref.setAttribute("href", "/filepath")Я использую thymeleaf и это прекрасно работает. Спасибо
В современном браузере вы можете использовать
promiseтакой. Создайте функцию загрузчика с обещанием в ней:function LoadCSS( cssURL ) { // 'cssURL' is the stylesheet's URL, i.e. /css/styles.css return new Promise( function( resolve, reject ) { var link = document.createElement( 'link' ); link.rel = 'stylesheet'; link.href = cssURL; document.head.appendChild( link ); link.onload = function() { resolve(); console.log( 'CSS has loaded!' ); }; } ); }тогда, очевидно, вы хотите что-то сделать после загрузки CSS. Вы можете вызвать функцию, которая должна работать после загрузки CSS следующим образом:
LoadCSS( 'css/styles.css' ).then( function() { console.log( 'Another function is triggered after CSS had been loaded.' ); return DoAfterCSSHasLoaded(); } );Полезные ссылки, если вы хотите понять, как это работает:
официальные документы по обещаниям
Comments