Foros del Web » Programando para Internet » Javascript »

Sencillo pero raro, redefinir ancho y alto

Estas en el tema de Sencillo pero raro, redefinir ancho y alto en el foro de Javascript en Foros del Web. Actualmente tengo una función que crea una ventana (una capa CSS) mediante DOM con la siguiente estructura: Código PHP: < div id = "ventana" > < ...
  #1 (permalink)  
Antiguo 17/11/2009, 19:11
Avatar de caneva  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla (España)
Mensajes: 81
Antigüedad: 18 años, 7 meses
Puntos: 1
Sencillo pero raro, redefinir ancho y alto

Actualmente tengo una función que crea una ventana (una capa CSS) mediante DOM con la siguiente estructura:
Código PHP:
<div id="ventana">
<
div id="fondo"></div>
<
div id="contenido>
</div>
</div> 
el div "fondo" es simplemente un fondo transparente blanco. Dentro de esa misma función que crea la "ventana" tras crear el <div> "contenido" este se rellena leyendo un archivo .php con por ejemplo un formulario. Llegados a este punto pense que para situar la capa "contenido" en el centro de la pantalla primero dejaría que se llenara con el archivo .php y luego tras colocar el objeto en su sitio haría una llamada a ese al div de id="contenido" para coger su ancho y alto y así poder posicionarla correctamente, pero el problema es que estos no existen y esa es mi sorpresa, si has rellenado un div con algo el div se adapta al lo que le eches en dimensiones, pero su valor de ancho y alto no aparecen por ningún lado ¿alguna idea?
__________________
Cita:
"El camino empieza renunciando al control, y volviéndose flexibles."
  #2 (permalink)  
Antiguo 17/11/2009, 19:32
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 9 meses
Puntos: 1485
Respuesta: Sencillo pero raro, redefinir ancho y alto

¿los valores de ancho y alto estan definidos en un stylesheet? bien, si es el caso, leer las dimensiones a traves del objeto style del elemento, siempre te devolvera un valor vacio. la razon es que el objeto style no es otra cosa mas que el atributo style de los elementos. si el elemento no tiene definido el atributo, todos los valores que intentes recoger por el objeto style seran devuelto vacios. para ello, puedes usar otra propiedad que devuelve las dimensiones del elemento: offsetWidth y offsetHeight. fijate que son propiedades del elemento, no del objeto style.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 17/11/2009, 19:59
Avatar de caneva  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla (España)
Mensajes: 81
Antigüedad: 18 años, 7 meses
Puntos: 1
Respuesta: Sencillo pero raro, redefinir ancho y alto

Cita:
Iniciado por zerokilled Ver Mensaje
¿los valores de ancho y alto estan definidos en un stylesheet? bien, si es el caso, leer las dimensiones a traves del objeto style del elemento, siempre te devolvera un valor vacio. la razon es que el objeto style no es otra cosa mas que el atributo style de los elementos. si el elemento no tiene definido el atributo, todos los valores que intentes recoger por el objeto style seran devuelto vacios. para ello, puedes usar otra propiedad que devuelve las dimensiones del elemento: offsetWidth y offsetHeight. fijate que son propiedades del elemento, no del objeto style.
Efectivamente los valores de ancho alto se pretendían alterar mediante objeto.style.height/widht respectivamente, claro que para que se adaptara el div al contenido cargado desde el .php directamente en la creación del objeto no definí ningún height ni width que pudiera limitar esa "adaptabilidad".

Parece por tanto que la única opción que me queda es la que comentas de usar offsetWidth y offsetHeight, pero me surge otro problema, cree esta función:

Código:
function recolocar_ventana()
{
	var ventana = document.getElementById("contenido");
	var anchofinal = ventana.offsetWidth;
	var altofinal = ventana.offsetHeight;
	alert("Anchofinal: "+anchofinal+", Altofinal: "+altofinal);
	ventana.style.marginLeft = "-"+ (anchofinal/2) + "px";
	ventana.style.marginTop = "-" + (altofinal/2) + "px";
}
Y luego hice una llamada a la misma dentro de la función que crea la ventana, pero justo después de que esta fuera rellenada y colocada en el html. Extrañamente devuelve los valores incorrectos, como si no le hubiera dado tiempo a rellenar el <div> con el contenido de .php, ya que si llamo a la función desde un enlace cargado a la vez que el formulario si responde bien ¿sugerencias? ¿un wait o algo antes de la llamada u alguna forma mas exacta de saber si el div se ha rellenado bien antes de mirar su ancho y alto?
__________________
Cita:
"El camino empieza renunciando al control, y volviéndose flexibles."
  #4 (permalink)  
Antiguo 17/11/2009, 20:13
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 9 meses
Puntos: 1485
Respuesta: Sencillo pero raro, redefinir ancho y alto

¿como estas rellenando el DIV? ¿con ajax? si es asi, ¿en que momento invocas la funcion que crea la ventana?
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 17/11/2009, 20:17
Avatar de caneva  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla (España)
Mensajes: 81
Antigüedad: 18 años, 7 meses
Puntos: 1
Respuesta: Sencillo pero raro, redefinir ancho y alto

Cita:
Iniciado por zerokilled Ver Mensaje
¿como estas rellenando el DIV? ¿con ajax? si es asi, ¿en que momento invocas la funcion que crea la ventana?
Código PHP:
function recolocar_ventana()
{
    var 
ventana document.getElementById("contenido");
    var 
anchofinal ventana.offsetWidth;
    var 
altofinal ventana.offsetHeight;
    
alert("Anchofinal: "+anchofinal+", Altofinal: "+altofinal);
    
ventana.style.marginLeft "-"+ (anchofinal/2) + "px";
    
ventana.style.marginTop "-" + (altofinal/2) + "px";
}

function 
crear_ventana(nombreanchoaltoreferenciaseccion)
{
    var 
anterior document.getElementById(nombre);
    if ( !
anterior //Si no existe ya esa ventana creala. 
    
{
        var 
divprincipal document.createElement("div"); //Creamos un elemento div
        
divprincipal.setAttribute("id"nombre); //Le asignamos como Id el parámetro nombre.
        
divprincipal.style.visibility "visible";
        
        
//Creamos sus dos divs hijos.
        
var hijoprincipal document.createElement("div");
        
divprincipal.appendChild(hijoprincipal);
        
hijoprincipal.setAttribute("id""fondo");
        
//Atributos de estilo CSS:
        
hijoprincipal.style.position "absolute";
        
hijoprincipal.style.backgroundColor "#CCCCCC";
        
hijoprincipal.style.opacity "0.5";
        
hijoprincipal.style.filter "alpha(opacity=50)";
        
hijoprincipal.style.height "100%";
        
hijoprincipal.style.width "100%";    
        
hijoprincipal.style.top "0";
        
hijoprincipal.style.left "0";
        
hijoprincipal.style.zIndex "1";
        
        var 
hijosecundario document.createElement("div");
        
divprincipal.appendChild(hijosecundario);
        
hijosecundario.setAttribute("id""contenido");
        
//Atributos de estilo CSS:
        
hijosecundario.style.position "absolute";
        
hijosecundario.style.backgroundColor "#FFFFFF";;
        
hijosecundario.style.top "50%";
        
hijosecundario.style.left "50%";
        
hijosecundario.style.zIndex "2";
        
hijosecundario.style.padding "25px";
        
        
xhr getHTTPObject();
        
xhr.onreadystatechange = function(){
        if(
this.readyState != 4)return;
        
hijosecundario.innerHTML this.responseText//hijosecundario es el objeto DOM que contendrá lo que se cargue en la petición ajax
        
}
        
xhr.open('get''http://www.midominio.com/objetos/formularios/'nombre +'.php?sec='secciontrue); //Cargar el contenido de la ventana
        
xhr.send(null);
        
//Colocamos el divprincipal con sus hijos en el punto de referencia del html o "ancla".        
var ancla document.getElementById(referencia);
        
ancla.appendChild(divprincipal);
        
        
recolocar_ventana(); //Reposicionamos la "ventana"
    
}
    else
    { 
abrir_ventana(nombre); }

Por cierto el error no ocurre en IE, si en FF y Chrome.
__________________
Cita:
"El camino empieza renunciando al control, y volviéndose flexibles."

Última edición por caneva; 17/11/2009 a las 21:08
  #6 (permalink)  
Antiguo 17/11/2009, 20:30
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 9 meses
Puntos: 1485
Respuesta: Sencillo pero raro, redefinir ancho y alto

intentalo asi. la siguiente porcion corresponde al evento onreadystatechange.
Código:
hijosecundario.innerHTML = this.responseText; //hijosecundario es el objeto DOM que contendrá lo que se cargue en la petición ajax
recolocar_ventana(); //Reposicionamos la "ventana"
}
si aun asi te da problema, la ultima solucion que se me ocurre (y que a mi juicio es un tanto puerco), invocas la funcion programandola con un tiempo. o sea, setTimeout.
Código:
setTimeout(recolocar_ventana, 250); // se ejecuta luego de 250ms;
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #7 (permalink)  
Antiguo 17/11/2009, 20:49
Avatar de caneva  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla (España)
Mensajes: 81
Antigüedad: 18 años, 7 meses
Puntos: 1
Respuesta: Sencillo pero raro, redefinir ancho y alto

Cita:
Iniciado por zerokilled Ver Mensaje
intentalo asi. la siguiente porcion corresponde al evento onreadystatechange.
Código:
hijosecundario.innerHTML = this.responseText; //hijosecundario es el objeto DOM que contendrá lo que se cargue en la petición ajax
recolocar_ventana(); //Reposicionamos la "ventana"
}
si aun asi te da problema, la ultima solucion que se me ocurre (y que a mi juicio es un tanto puerco), invocas la funcion programandola con un tiempo. o sea, setTimeout.
Código:
setTimeout(recolocar_ventana, 250); // se ejecuta luego de 250ms;
Colocandola ahí funciona al contrario, es decir en FF y Chrome pero no en IE ¿acaso manejan de forma distinta los eventos de ajax? de todas formas no le veo el sentido, porque si ahí aun no han colocado el contenido ¿cómo es que ya saben FF y Chrome el valor del ancho y alto?

Si, la solución del timer funciona, pero como a ti no me gusta, debe haber otra menos "chapuza" :S
__________________
Cita:
"El camino empieza renunciando al control, y volviéndose flexibles."
  #8 (permalink)  
Antiguo 17/11/2009, 21:05
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 9 meses
Puntos: 1485
Respuesta: Sencillo pero raro, redefinir ancho y alto

jeje, se soluciona un error para entrar en otro! ahi me agarraste. en terminos practico yo no uso ajax pero en teoria se como funciona. de todos modos, si puedes hacer una version reducida y subirla a la web para ver si le encuentro alguna solucion. sino, pasate por el foro AJAX, quizas alli esten mas familiarizado con los errores referente a renderizacion con XHR. es curioso, en teoria asi es como debe ir el codigo.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
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 14:17.