Изменить содержимое элемента <style>через JavaScript - PullRequest
6 голосов
/ 23 апреля 2010

Проблема

У меня есть следующий код:

<html>
<head>
<style id="ID_Style">
.myStyle
{
   color : #FF0000 ;
}
</style>
</head>
<body>

   <p class="myStyle">
      Hello World !
   </p>

</body>
</html>

И я хочу изменить содержимое <style> через JavaScript.

Ожидаемое решение

Первым решением было использование свойства innerHTML элемента style (полученного через его идентификатор), но, хотя он работает в Firefox, он не работает в Internet Explorer 7.

Итак, я использовал чистые методы DOM, то есть создавал элемент с именем style, текстовый узел с нужным содержимым, добавлял текстовый узел как дочерний элемент к стилю и т. Д. Он тоже не работает.

Согласно MSDN, элемент <style> имеет свойство innerHTML, а согласно W3C элемент <style> является HTMLStyleElement, который происходит от HTMLElement, полученного из Element, полученного из Node, который имеет метод appendChild , Кажется, он ведет себя так, как будто содержимое элемента <style> было доступно только для чтения в Internet Explorer.

Вопрос

Итак, вопрос: Есть ли способ изменить содержимое элемента <style> в Internet Explorer?

Хотя текущая проблема связана с IE7, кросс-браузерное решение было бы неплохо, если это возможно.

Приложение

Источники:

Элемент стиля (MSDN): http://msdn.microsoft.com/en-us/library/ms535898.aspx

HTMLStyleElement (W3C): http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-16428977

Полный код теста

Вы можете использовать этот тестовый код, если хотите воспроизвести вашу проблему:

<html>
<head>
<style id="ID_Style">
.myStyle
{
   color : #FF0000 ;
}
</style>
<script>
function replaceStyleViaDOM(p_strContent)
{
   var oOld = document.getElementById("ID_Style") ;
   var oParent = oOld.parentNode ;
   oParent.removeChild(oOld) ;

   var oNew = document.createElement("style") ;
   oParent.appendChild(oNew) ;

   oNew.setAttribute("id", "ID_Style") ;
   var oText = document.createTextNode(p_strContent) ;
   oNew.appendChild(oText) ;
}

function replaceStyleViaInnerHTML(p_strContent)
{
   document.getElementById("ID_Style").innerHTML = p_strContent ;
}
</script>
<script>
function setRedViaDOM()
{
   replaceStyleViaDOM("\n.myStyle { color : #FF0000 ; }\n")
}

function setRedViaInnerHTML()
{
   replaceStyleViaInnerHTML("\n.myStyle { color : #FF0000 ; }\n")
}

function setBlueViaDOM()
{
   replaceStyleViaDOM("\n.myStyle { color : #0000FF ; }\n")
}

function setBlueViaInnerHTML()
{
   replaceStyleViaInnerHTML("\n.myStyle { color : #0000FF ; }\n")
}

function alertStyle()
{
   alert("*******************\n" + document.getElementById("ID_Style").innerHTML + "\n*******************") ;
}
</script>
</head>
<body>

   <div>
      <button type="button" onclick="alertStyle()">alert Style</button>
      <br />
      <button type="button" onclick="setRedViaDOM()">set Red via DOM</button>
      <button type="button" onclick="setRedViaDOM()">set Red via InnerHTML</button>
      <br />
      <button type="button" onclick="setBlueViaDOM()">set Blue via DOM</button>
      <button type="button" onclick="setBlueViaInnerHTML()">set Blue via InnerHTML</button>
   </div>

   <p class="myStyle">
      Hello World !
   </p>

</body>
</html>

Спасибо!

Редактировать

Обратите внимание, что перемещение элемента <style> из <head> в <body> не меняет проблему.

Ответы [ 2 ]

15 голосов
/ 27 апреля 2011

Генерация CSS на лету имеет свои преимущества.Если вы хотите установить innerHTML элемента стиля в IE, используйте styleSheet.cssText.Например: http://jsbin.com/awecu4

<!doctype html>
<script>
var style = document.createElement('style'),
script = document.getElementsByTagName('script')[0],
styles = '#test{background:green;}';
script.parentNode.insertBefore(style, script);

try{style.innerHTML = styles;}
//IE fix
catch(error){style.styleSheet.cssText = styles;}
</script>
<div id=test>Div with id of test</div>
7 голосов
/ 26 февраля 2014

Сегодня во всех браузерах (включая, я полагаю, IE9 +) вы можете установить значение textContent для элемента style, и оно будет работать так, как вы хотите, включая > в селекторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...