Ver Mensaje Individual
  #11 (permalink)  
Antiguo 27/07/2010, 15:58
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,

aunque la forma de incluir las nuevas reglas mediante la creación de un nuevo elemento, ya sea link o style, evita tener que usar métodos, que aunque están definidos en el estandar, explorer no sigue, y nos obligaría a incluir en nuestro código una alternativa para ese navegador, eso no evita los problemas inherentes del lenguaje CSS relacionados con el orden en cascada de las hojas de estilos. Es por eso por lo que no es práctico trabajar directamente sobre hojas de estilos. Por ejemplo:

Siguiendo con el ejemplo de @Panino5001 y modificándolo un poco (espero que no te importe), si al div con id 'pp' al que vamos a aplicar la nueva regla css para modificar las propiedades width, height y background-color le hubiéramos definido previamente otros valores para esas propiedades: a height mediante el atributo style, a width mediante la etiqueta <style></style> y a background-color mediante la propiedad .style.backgroundColor, al aplicar la nueva regla con la que suponemos queremos cambiar los 3 valores, sólo se cambiará el de la propiedad width ya que los estilos en línea (atributo y propiedad style) tienen prioridad en el orden de cascada y lo que se incluye con la etiqueta style es como si se hiciera en una hoja de estilos externa y modifica el valor existente por incluirlo después, ya que prevalece el último valor declarado (si lo incluyeramos antes de la etiqueta que ya existe tampoco cambiaría).

Si definimos los estilos como ficheros .css o con la etiqueta <style> no dispondríamos de su valor a través de la propiedad .style y para conocer estos valores tendríamos que recurrir a las estilos computados. Como se ve en la función css del ejemplo de Panino explorer también tiene sus propias propiedades y esto también complica nuestro código. Además el estilo computado es el valor calculado después de analizar todas las reglas que están afectadas por ese estilo para ese elemento y de pasar a absolutas todas las medidas y obliga a hacer más cálculos ya que cada vez que cambie una propiedad habría que volver a calcularlo.

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  4. <title>Documento sin título</title>
  5.  
  6. function addCss(cssCode,i) {
  7.     var control=document.getElementById(i)
  8.     if(control)
  9.         document.getElementsByTagName("head")[0].removeChild(control)
  10.     var styleElement = document.createElement("style");
  11.     styleElement.type = "text/css";
  12.     if (styleElement.styleSheet) {
  13.         styleElement.styleSheet.cssText = cssCode;
  14.     } else {
  15.         styleElement.appendChild(document.createTextNode(cssCode))
  16.     }
  17.     styleElement.id =i;
  18.     document.getElementsByTagName("head")[0].appendChild(styleElement);
  19. }
  20.  
  21. function t(id){return document.getElementById(id);}
  22.  
  23. function css(id,prop){
  24.     var valor;
  25.     if(window.getComputedStyle){
  26.         valor = window.getComputedStyle(t(id),null).getPropertyValue(prop);
  27.     }
  28.     else{
  29.         var re = /(-([a-z]){1})/g;
  30.  
  31.         if (re.test(prop)) {
  32.             prop = prop.replace(re, function () {
  33.                 return arguments[2].toUpperCase();
  34.             });
  35.         }
  36.         valor = t(id).currentStyle[prop] ? t(id).currentStyle[prop] : null;
  37.     }
  38.    
  39.     return valor;
  40. }  
  41.  
  42. onload=function(){
  43.  
  44.      t('pp').style.backgroundColor = 'yellow'; <!-- definicion original prop. background-color -->
  45.  
  46.      <!-- calculamos los valores computados originales -->
  47.      var heightCompu = css('pp','height'); <!-- definido con atribute style -->
  48.      var widthCompu = css('pp', 'width'); <!-- definido con etiqueta <style></style> -->
  49.      var backgCompu = css('pp', 'background-color'); <!-- definido con propiedad .style -->
  50.      
  51.      alert('height computado original: ' + heightCompu + ' height con style: ' + t('pp').style.height);
  52.      <!-- el valor de la prop. style.width sale en blanco porque se definió como hoja de estilos externa -->
  53.      alert('width computado original: ' + widthCompu + ' width con style (sale en blanco): ' + t('pp').style.width);
  54.      alert('background computado original: ' + backgCompu + ' background con style: ' + t('pp').style.backgroundColor);
  55.      
  56.      <!-- añadimos una nueva regla a la hoja de estilos mediante una nueva etiqueta <style></style> -->
  57.     addCss('#pp{background-color:red; width:20%; height:100px;}',new Date().getTime());
  58.    
  59.      <!-- solo cambia la prop. width por la prioridad de la cascada de las hojas de estilo -->
  60.     alert('nuevo height computado: (no cambia) ' + heightCompu + ' height con style: ' + t('pp').style.height);
  61.     <!-- el valor de la prop. style.width sigue saliendo en blanco porque se ha cambiado en la hoja de estilos externa -->
  62.      alert('width computado: (cambia pero no se ha actualizado) ' + widthCompu + ' width con style (sigue en blanco) : ' + t('pp').style.width);
  63.      alert('background computado: (no cambia) ' + backgCompu + ' background con style: ' + t('pp').style.backgroundColor);
  64.  
  65.      <!-- para disponer del valor del width a través de .style.width habría que usar esa prop. para cambiar el valor -->
  66.      t('pp').style.width = '40%';
  67.      
  68.      alert('width computado: (no se actualiza) ' + widthCompu + ' width con style (valor correcto): ' + t('pp').style.width);
  69.      
  70.     <!-- hay que volver a calcular los valores computados  -->
  71.      widthCompu = css('pp', 'width');
  72.      
  73.      alert('width computado: (actualizado) ' + widthCompu + ' width con style (valor correcto): ' + t('pp').style.width);
  74.      
  75. }
  76. #pp {width: 30%;}
  77. </head>
  78.  
  79. <div id="pp" style="height:200px;"></div>
  80.  
  81. </body>
  82. </html>