Foros del Web » Programando para Internet » Javascript »

Misterio de la lectura CSS

Estas en el tema de Misterio de la lectura CSS en el foro de Javascript en Foros del Web. Hola a todos, Llevare 3 años con el javascript dandole por todos lados. El caso es que hoy, ahora que se mas que hace 2 ...
  #1 (permalink)  
Antiguo 07/02/2011, 08:47
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Misterio de la lectura CSS

Hola a todos,

Llevare 3 años con el javascript dandole por todos lados. El caso es que hoy, ahora que se mas que hace 2 años... me topo con un misterio que siempre he conocido... y que como buen programador eficiente he resuelto con parches y demas.

El caso es que de hoy no pasa y me he puesto a buscar info pero no he encontrado, la verdad es que es dificil de buscar en google, me he topado con gente preguntando pero sin respuestas. Asi que pregunto.

¿Por que no puedo saber el color de Wally en este ejemplo?... y... como lo puedo resolver?... si os fijais en Snoopy si funciona ya que el stylo esta en su etiqueta... si lo pongo entre los <style> o en una hoja css no los lee.

Ejemplo ultratonto:
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=UTF-8" />
  4. <title>Misterio del css</title>
  5.     #wally{ display:inherit; background:red; margin:10px; padding:10px;}
  6. </head>
  7.  
  8.     Si clicas en el boton "uno" no sale nada... En cambio si clicas en "dos" si... ¿cuál es la razón?
  9.     <div id="wally">¿Dónde estoy?</div>
  10.     <div id="snoopy"  style="display:inherit; margin:10px; background:red; padding:10px;">¿Dónde estoy?</div>
  11.     <input id="uno" type="button"  value="qué fondo tiene wally?" onclick="alert(document.getElementById('wally').style.background);" />
  12.     <input id="dos" type="button"  value="qué fondo tiene snoopy?" onclick="alert(document.getElementById('snoopy').style.background);" />
  13. </body>
  14. </html>

La verdad es que mira que tengo funciones para ocultar bloques en JS... primero pregunto el display='none'... pero mira que siempre acabo escribiendolo en la misma etiqueta... asi que... como lo soluciono?

EDITO: mirar que igual tengo suerte y son un paquete de narices... y llevo haciendolo mal 3 años seguidos... es mas que posible.
  #2 (permalink)  
Antiguo 07/02/2011, 08:55
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Misterio de la lectura CSS

El problema es que style solo lee el estilo que ha sido seteado por javascript o el estilo en linea del elemento.

Lo que necesitas es saber el "computed style" del elemento.

Saludos
__________________
I see dead pixels
  #3 (permalink)  
Antiguo 07/02/2011, 09:01
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Misterio de la lectura CSS

Hola SergeMedina... que rapido...

He encontrado esta funcion... pensaba que no funcionaba... pero la estaba implementando mal... tenia que poner background-colo en vez de background... con esta funcion puedo saber el valor de un elemento al cargar la web con estilos en una hoja.

Código HTML:
Ver original
  1. function getStyle(oElm, strCssRule){
  2.     var strValue = "";
  3.     if(document.defaultView && document.defaultView.getComputedStyle){
  4.        strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
  5.     }
  6.     else if(oElm.currentStyle){
  7.         strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
  8.             return p1.toUpperCase();
  9.         });
  10.         strValue = oElm.currentStyle[strCssRule];
  11.     }
  12.     return strValue;
  13. }


Ahora miro tu link y te digo.
  #4 (permalink)  
Antiguo 07/02/2011, 09:10
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Misterio de la lectura CSS

JavierB tiene unas funciones para eso, yo las recopilé todas en un objeto, mira a ver si te sirve:
Código Javascript:
Ver original
  1. String.prototype.low=function(){ return this.toLowerCase(); };
  2. var extSS = function(){};
  3. extSS.prototype = {
  4.  isIE : document.all,
  5.  instrucciones : {
  6.   'reglas' : this.isIE ? 'rules' : 'cssRules',
  7.   'add' : (this.isIE ? 'add' : 'insert') + 'Rule',
  8.   'remove' : (this.isIE ? 'remove' : 'delete') + 'Rule'
  9.  },
  10.  hojas : document.styleSheets,
  11.  getSS : function(id){
  12.   var cosa;
  13.   switch(typeof id){
  14.    case 'number' :
  15.     return this.hojas[id] ? this.hojas[id] : false;
  16.    break;
  17.    case 'string' :
  18.     for(var url = /(file|http):\/\/(\/*).+\//, i=0; cosa = this.hojas[i]; i++){
  19.      if(cosa.href == id || cosa.href.replace(url, '') == id || cosa.href.replace(url, '').replace(/\.css$/, '') == id)
  20.       return cosa;
  21.     }
  22.    break;
  23.   }
  24.   return false;
  25.  },
  26.  find : function(select, propi){
  27.   var estilo;
  28.   for(i=0; sheet = this.hojas[i]; i++){  
  29.    estilo = sheet[this.instrucciones['reglas']];
  30.    for(j=0; regla = estilo[j]; j++){
  31.     if(regla.selectorText.low() == select.low() && regla.style[propi])
  32.      return regla.style[propi];
  33.    }
  34.   }
  35.   return false;
  36.  },
  37.  set : function(select, propi, val){
  38.   var estilo;
  39.   for(i=0; sheet = this.hojas[i]; i++){  
  40.    estilo = sheet[this.instrucciones['reglas']];
  41.    for(j=0; regla = estilo[j]; j++){
  42.     if(regla.selectorText.low() == select.low() && regla.style[propi])
  43.      regla.style[propi] = val;
  44.    }
  45.   }
  46.   return false;
  47.  },
  48.  add : function(hoja, select, propi, val){
  49.   var SS = this.getSS(hoja);
  50.   try{
  51.    SS.insertRule(select + '{' + propi + ':' + val + '}', SS[this.instrucciones['reglas']].length);
  52.   }catch(e){ // IE
  53.    SS.addRule(select, propi + ':' + val);
  54.   }
  55.  },
  56.  remove : function(hoja, select){
  57.   var estilo;
  58.   switch(typeof hoja){
  59.    case 'number' :
  60.     estilo = this.hojas[hoja][this.instrucciones['reglas']];
  61.     for(i=0; regla = estilo[i]; i++){
  62.      if(regla.selectorText.low() == select.low())
  63.       this.getSS(hoja)[this.instrucciones['remove']](j);
  64.     }
  65.    break;  
  66.    case 'string' :
  67.     if(hoja=='all'){
  68.      for(i=0; sheet = this.hojas[i]; i++){
  69.       estilo = sheet[this.instrucciones['reglas']];
  70.       for(j=0; regla = estilo[j]; j++){
  71.        if(regla.selectorText.low() == select.low())
  72.         sheet[this.instrucciones['remove']](j);
  73.       }
  74.      }
  75.     }else{
  76.      var SS = this.getSS(hoja), estilo = SS[this.instrucciones['reglas']];
  77.      for(i = 0; regla = estilo[i]; i++){
  78.       if(regla.selectorText.low() == select.low())
  79.        SS[this.instrucciones['remove']](i)
  80.      }
  81.     }
  82.    break;
  83.   }
  84.  }
  85. };
  86. var SS = new extSS();
Esto busca por las StyleSheets del documento, así que no te servirá para saber por ejemplo el tamaño de fuente de un párrafo sin ningún estilo (para se usa getComputedStyle() creo), pero si lo tienes definido en algún sitio sí.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #5 (permalink)  
Antiguo 07/02/2011, 09:17
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Misterio de la lectura CSS

Hola,

Muchas gracias por la ayuda... con lo que me comentais estoy empezando a coger el trankillo a esto... es que mira que lo tenia atravesado!... es una cosa ultranecesaria... pero lo vas dejando para otro momento y al final pasan años... :P.

_cronos2... eso es prototype?... si lo es me dan miedo las librerias... :P. Pero gracias por la info...

SergeMedina... tambien gracias por la velo...

El caso es que despues de la ver la funcion getStyle... me parece que me voy a quedar con ella... :P... es facil de usar.

Bueno compis... muchas gracias... y siento molestar... es que mira que encontrar la solucion en la misma hora que la he preguntado... es que... ZASKA!... en toda la boca...

Hasta pronto!.
  #6 (permalink)  
Antiguo 07/02/2011, 12:45
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Misterio de la lectura CSS

No, yo tampoco usa librerías, pero es el prototipo de una función, que no tiene que ver con la librería Prototype (o sí, porque como no la uso no sé en qué se basa xD)
Si te digo la verdad no sé qué es exactamente un prototipo, pero sé que equivale a esto:
Código Javascript:
Ver original
  1. function miFuncion(){
  2.  this.miMetodo = function(){
  3.   alert('hola');
  4.  };
  5. }
  6. miFuncion.prototype.miMetodo = function(){
  7.   alert('hola');
  8. }
La diferencia es algo así como que cuando usas prototype no tiene que copiar el método cada vez, sino que directamente cada miFuncion sale con el método predefinido. Sé que mi explicación y nada son lo mismo XD, por eso te dejo un enlace a maestrosdelweb donde lo explica buzu.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #7 (permalink)  
Antiguo 08/02/2011, 00:31
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Misterio de la lectura CSS

Hola _cronos2,

Gracias de nuevo por la ayuda. La verdad es que me he leido el articulo de buzu... y aunque no esta a mi nivel de conocimientos... algo he entendido. Pero no se que aplicaciones puede tener... supongo que para gente con mas nivel, la verdad es que me gustaria saber sacarle partido... :P.

No lo conoca de nada... ahora mismo me leo mas por google... ejemplos y demas.... igual tengo suerte y lo acabo usando en todas partes...

Gracias!... ah!... y a buzu tambien!.
  #8 (permalink)  
Antiguo 08/02/2011, 09:20
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Misterio de la lectura CSS

Se puede usar para extender un objeto pero también una clase, que es algo bastante práctico. Ej:
Código Javascript:
Ver original
  1. String.prototype.low=function(){ return this.toLowerCase(); };
  2. alert('EN MINÚSCULAS'.low()); // 'en minúsculas'
Y así con Number, Array, Object...
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Etiquetas: css, lectura
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:41.