Ver Mensaje Individual
  #3 (permalink)  
Antiguo 22/07/2010, 09:34
Avatar de Tecna
Tecna
 
Fecha de Ingreso: enero-2010
Mensajes: 291
Antigüedad: 14 años, 3 meses
Puntos: 45
Respuesta: Firefox Security error code: 1000

Buenas,

normalmente no es muy útil trabajar directamente sobre las hojas de estilos porque éstas suelen tener numerosas reglas y algunas pueden hacer referencia a la misma propiedad del mismo elemento con la misma o más profundidad en la declaración del selector, teniendo que determinar el valor computado con la prevalencia que dicta el orden en cascada de las propiedades, es decir que si queremos cambiar un elemento en concreto aunque lo pongamos al final de la hoja de estilos puede que el estilo no se aplique si hay anteriormente alguna regla con más peso especifico que modifique la misma propiedad de ese mismo selector, como por ejemplo querer modificar los enlaces usando el selector "a" si previamente se ha definido ese mismo estilo con "li a", que tendría más peso al definirse con 2 selectores y sería el que prevalecería. Además al incluir y borrar nuevas reglas puede que el orden de éstas dentro del array cssRules cambie y también su longitud con lo que aunque definamos las nuevas reglas siempre al final, habría que conocer previamente la propiedad length de cssRules. Por otro lado IE, no se en las últimas versiones, pero tenía sus propios métodos y cambiaba el nombre del array que guarda las reglas leídas de la hoja de estilos por lo que siempre nos dará más quebraderos de cabeza mantener la compatibilidad que si trabajamos directamente con la propiedad style del elemento que queramos cambiar.

La única ventaja que veo a trabajar con las hojas de estilo directamente es que así se puede tener acceso a los valores iniciales de las propiedades de cada elemento aunque éstas se hayan definido en hojas de estilos externas (que es lo más recomendable) o mediante el atributo style, que no ocurre con la propiedad style del objeto CSS2Properties en la que no están accesibles a no ser que se definan con la etiqueta <style> o con secuencias de comandos dentro del propio javascript. Con cssRules podemos tener un control completo sobre el orden de cascada y sobre todas las reglas que afectan a un determinado elemento, algo parecido a lo que hace firebug. Pero para modificar estilos concretos de elementos o grupos de elementos concretos es mucho mas eficaz la propiedad style de CSS2Properties. Y para obtener el valor computado que es el que realmente se aplica, si hay varias reglas por ejemplo, el metodo getComputed()

Los ficheros de las hojas de estilo en realidad no se modifican, lo que se modifica es el array cssRules donde se guardan las reglas del fichero css, debido a las restricciones de seguridad que tiene javascript en la parte del cliente que no permite leer ni mucho menos escribir o borrar archivos o directorios. Como bien dijo @Zerokilled, es cierto que sólo da ese error cuando es un recurso externo, pero no sólo pasa en firefox, o por lo menos a mi. Y creo que está bien que así sea porque si que se podría incluir código javascript dentro de una regla css y posteriormente ejecutarlo aunque seguirá teniendo las restricciones propias de javascript. He hecho un ejemplo.

Código Javascript:
Ver original
  1. // ejemplo para incluir codigo javascript dentro de una regla css creada con insertRule
  2. // By Tecna
  3.  
  4. function init()
  5. {
  6.     var reglas = document.styleSheets[0].cssRules;
  7.     var css = document.getElementById('css');
  8.     var js = document.getElementById('js');
  9.     css.onclick = function () {nuevoCSS(reglas, css, js);};
  10.     js.onclick = function () {nuevoJS(reglas);};   
  11. }
  12.  
  13.  
  14. window.onload = init;
  15.  
  16. function nuevoCSS(reglas, css, js)
  17. {
  18.     document.styleSheets[0].insertRule ('#css {content: \"alert(\'alert insertado como propiedad content en fichero css\')\"; background: #f0f;}', 1);
  19.     alert('nueva regla para el selector #css con codigo js incluido: ' + reglas[1].cssText);
  20.     js.style.visibility = 'visible';
  21. }
  22.  
  23. function nuevoJS(reglas)
  24. {
  25.     var scriptI = document.createElement('script');
  26.     scriptI.innerHTML = reglas[1].cssText.split('"')[1];
  27.     document.body.appendChild(scriptI);
  28. }

Código HTML:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2.     <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  3.     <title>Incluir propiedad en hoja de estilos con javascript incluido</title>
  4.     <link rel="stylesheet" href="fichero.css" type="text/css">
  5.     <script type="text/javascript" src="fichero.js"></script>
  6. </head>
  7.     <a href="#" id="css">incluir css con js</a>
  8.     <a href="#" id="js">ejecutar js del css</a>
  9.     <script>document.getElementById('js').style.visibility = 'hidden';</script>
  10. </body>
  11. </html>

Código CSS:
Ver original
  1. a {
  2.     display: block;
  3.     width: 150px;
  4.     height: 50px;
  5.     line-height: 50px;
  6.     background: #ff0;
  7.     float: left;
  8.     margin: 20px;
  9.     text-align: center;
  10. }