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

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

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
7
0
16 255
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

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

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

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);

innerHTML является устаревшим методом и не должен использоваться вообще.

karlcow 07.12.2010 01:06

хм да я даже не знаю, зачем я это написал. Не помню, о чем я думал, когда писал это.

karlcow 28.12.2010 00:03
innerHTML не является устаревшим.
felixfbecker 27.11.2020 22:17

Спасибо, Vatos, вы дали мне хорошее руководство, в основном я сделал то, что вы предлагали, но использовал jquery для установки html и добавления нового стиля в заголовок, поскольку safari / chrome останавливался при выполнении innerHTML и document.head был undefined. Мой код закончился так

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

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

    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 устарел и не должен использоваться для подобных целей. Кроме того, он тоже медленнее.

Самый простой способ (то есть с использованием 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 (который работает в основных браузерах, включая 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.

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

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

Чтобы правильно ввести текст css, вы должны:

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

а также

style.appendChild (document.createTextNode ("...")); для webkit.

Firefox также будет работать со вторым вариантом или со style.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

document.querySelector('#x').style.sheet не определен.
Vitaly Zdanevich 14.06.2018 16:38

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

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

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

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

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

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