Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/12/2013, 03:26
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 10 meses
Puntos: 32
Respuesta: Crear hoja de estilo CSS con javascript

Bueno,

Después de buscar y buscar información he conseguido crear una función createStyleSheet que funcione para algún caso.

Código Javascript:
Ver original
  1. if(typeof document.createStyleSheet === 'undefined') {
  2.     document.createStyleSheet = function(href) {
  3.             if(typeof href !== 'undefined') {
  4.                 var element = document.createElement('link');
  5.                 element.type = 'text/css';
  6.                 element.rel = 'stylesheet';
  7.                 element.href = href;
  8.             }
  9.             else {
  10.                 var element = document.createElement('style');
  11.                 element.type = 'text/css';
  12.             }
  13.             console.log( element );
  14.  
  15.             var index = document.styleSheets.length;
  16.             document.getElementsByTagName('head')[0].appendChild(element);
  17.            
  18.             //comprobar si index document.styleSheets tienen los valores correctos
  19.             console.log( index );
  20.             console.log( document.styleSheets );
  21.  
  22.             //devolver referencia a hoja de estilos insertada
  23.             var sheet = document.styleSheets[index];
  24.             return sheet;
  25.     }
Es una función que añado a document tal que si le paso por parametro la localizacion de un fichero css me lo carga. En caso de no pasar ningún parametro me crea un elemento style. La función retorna la hoja de estilos insertada para luego modificarla insertando o removiendo reglas css a voluntad.

La cosa es que soy bastante quisquilloso y me gusta probar si dicha función funciona como debería funcionar para todos los casos. Lastimosamente he encontrado almenos un caso en la que no funciona correctamente:

Código Javascript:
Ver original
  1. window.onload = function() {
  2.     document.createStyleSheet( 'css/test.css' ); // cargar css externo
  3.     var sheet = document.createStyleSheet(); // crear css anonimo
  4.     sheet.insertRule('h1 { color: red; }', 0 );
  5.     console.log( sheet );
  6. }

Aquí el error que me manda por Chrome:

Código BASH:
Ver original
  1. <link type="text/css" rel="stylesheet" href="css/test.css">
  2. 1 insert_text.js:33
  3. StyleSheetList {0: CSSStyleSheet, length: 1, item: function}
  4.  insert_text.js:34
  5. <style type=&#8203;"text/​css">​</style>​
  6.  insert_text.js:27
  7. 1 insert_text.js:33
  8. StyleSheetList {0: CSSStyleSheet, length: 1, item: function}
  9.  Uncaught TypeError: Cannot call method 'insertRule' of undefined

Parece ser que cuando inserto un elemento link o style en head, no se actualiza directamente la lista document.styleSheets. Veo que quizá podría solucionarlo usando el truco de setTimeout( .., 0 ) después de insertar el elemento. Sin embargo este código:
Código Javascript:
Ver original
  1. var sheet = document.styleSheets[index];
  2. return sheet;
debería estar dentro de setTimeout. Y a mi me sobrepasa cómo poder insertar un return dentro de setTimeout.

PD.: Normalmente se aprende mucho de los pequeños baches que te vas encontrando pero para un novato como yo en Javascript esto empieza a parecerme frustrante. Parezco un imán de bugs.

Un saludo y gracias!