Как динамически загружать правила CSS в Webkit (Safari/Chrome)?

StackOverflow https://stackoverflow.com/questions/351633

  •  20-08-2019
  •  | 
  •  

Вопрос

В настоящее время у меня есть проблемы в Webkit (Safari и Chrome), когда я пытаюсь динамически загрузить (innerHTML) некоторый HTML в div, HTML содержит правила CSS (...), после визуализации HTML определения стилей не загружаются (поэтому визуально я могу сказать, что стилей нет, а также, если я ищу их с помощью JavaScript, стили не будут найдены).Я пробовал использовать плагин jquery tocssRule(), он работает, но слишком медленно.Есть ли другой способ заставить WebKit динамически загружать стили?Спасибо.Патрик

Это было полезно?

Решение

Я думаю, что лучше добавить тег «ссылка» в заголовок вашего документа.Если это невозможно, попробуйте добавить в заголовок тег «style».Теги стиля не должны быть в теле (даже не проходят проверку).

Добавить тег ссылки:

var link = document.createElement('link');

link.setAttribute('rel', 'stylesheet');

link.type = 'text/css';

link.href = 'http://example.com/stylesheet.css';

document.head.appendChild(link);

Добавить тег стиля:

var style = document.createElement('style');

style.innerHTML = 'body { background-color: #F00; }';

document.head.appendChild(style);

Другие советы

Прямой способ jQuery (который работает в основных браузерах, включая Chrome): http://topsecretproject.finitestatemachine.com/2009/09/how-to-load-javascript-and-css-dynamically-with-jquery/

С сайта:

$("head").append("<link />");
var CSS = $("head").children(":last");
CSS.attr({
"rel": "stylesheet",
"type": "text/css",
"href": "url/to.css"
});

Примечание:пример также включает внедрение JS, которое можно игнорировать, если вы просто хотите внедрить ссылку CSS.

Самый простой способ (с использованием jQuery) заключается в следующем:

var cssLink = $('<link />');
cssLink.attr("rel","stylesheet")
cssLink.attr("type", "text/css");
cssLink.attr("href","url/to.css");

Если вы сделаете это таким образом, это будет работать в Safari.Если вы сделаете это обычным способом jQuery (все в одной текстовой строке), это не удастся (css не загрузится).

Затем вы просто добавляете его в заголовок с помощью $('head').append(cssLink);

Спасибо, Ватос, вы дали мне хорошую подсказку, в основном я сделал то, что вы предложили, но использовал jquery для установки HTML и добавления нового стиля в заголовок, поскольку Safari/chrome останавливался при выполнении InnerHTML, а document.head был неопределенным.Мой код закончился так

var cssDefinitions = '..my style chunk goes here';
var style = document.createElement('style');'
$(style).html(cssDefinitions);
$('head').append(style);

хм.У меня недостаточно очков, чтобы проголосовать за результат Андрея Чимпоки, но это решение здесь самое лучшее.

style.innerHTML = "...";не работает в движках Webkit или т.е.

Чтобы правильно внедрить текст CSS, необходимо:

style.styleSheet.cssText = "...";для т.е.

и

style.appendChild(document.createTextNode("..."));для вебкита.

Firefox также будет работать со вторым вариантом или с помощью style.innerHTML = "...";

Вот концерт.То, что сказал Патрик, меня не сработало.Вот как я это сделал.

    var ref = document.createElement('style');
ref.setAttribute("rel", "stylesheet");
ref.setAttribute("type", "text/css");
document.getElementsByTagName("head")[0].appendChild(ref);
if(!!(window.attachEvent && !window.opera)) ref.styleSheet.cssText = asd;//this one's for ie
else ref.appendChild(document.createTextNode(asd));

InnerHTML устарел и не должен использоваться для таких целей.Кроме того, это еще и медленнее.

Помимо версий на основе тегов стиля, описанных выше, вы также можете добавлять стили напрямую с помощью JavaScript:

var style = document.getElementById('some-style-tag');
var sheet = style.sheet;
sheet.insertRule('.mydiv { background-color: ' + color + '; }', sheet.cssRules.length);

Преимущество этого заключается в возможности использовать переменные без необходимости прибегать к cssText/innerHTML.

Имейте в виду, что в браузерах на основе WebKit это может быть медленным, если вы вставляете много правил.Существует ошибка, позволяющая исправить эту проблему с производительностью в webkit (https://bugs.webkit.org/show_bug.cgi?id=36303).До тех пор вы можете использовать теги стиля для массовых вставок.

Это стандартный способ W3C вставки правил стиля, но он не поддерживается ни одной версией IE: http://www.quirksmode.org/dom/w3c_css.html

Я знаю, что это старая тема, но подумал, что кому-то будет полезно.Мне тоже нужно было динамически загружать CSS на мою страницу (до того, как все будет отображаться при загрузке, в соответствии с включенными шаблонами «компонентов»):

var oStyle = $("<style />");

oStyle.append("@import url(" + sTemplateCssUrl + ");");
oStyle.attr("type", "text/css");

$(document.head).append(oStyle);

Я попробовал добавить в document.head однострочный подход - работало в IE 10 и Chrome, но не в Safari.Описанный выше подход работал во всех 3.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top