Foros del Web » Programando para Internet » Javascript »

Mostrar y ocultar capas con Javascript

Estas en el tema de Mostrar y ocultar capas con Javascript en el foro de Javascript en Foros del Web. Hola, Estoy creando un formulario por pasos (lo típico de las compras: datos personales, pago.. etc) y lo que he hecho es hacer todas las ...
  #1 (permalink)  
Antiguo 08/08/2008, 11:29
Avatar de Cristiaen  
Fecha de Ingreso: enero-2008
Mensajes: 29
Antigüedad: 16 años, 3 meses
Puntos: 0
Mensaje Mostrar y ocultar capas con Javascript

Hola,

Estoy creando un formulario por pasos (lo típico de las compras: datos personales, pago.. etc) y lo que he hecho es hacer todas las capas en una misma página y al inciar las oculto todas con Javascript, excepto la primera. De esta manera voy mostrando cuando me interesa cada capa y me comunico con el servidor mediante Ajax para ir guardando los datos.

Funciona de maravilla en cualquier versión reciente de Firefox y Opera, pero no funciona en NINGUNA versión de IE. He intentado cambiar mil y una cosas, pero sigue sin ejecutar absolutamente ni una sóla linea de código, ¡ni una!

Antes de tirar el código a la basura, he pensado en preguntar a ver si a alguien se le ocurre qué puede pasar:

Código:
	function nuevoAjax()
 	 { var xmlHttp;
  try { xmlHttp=new XMLHttpRequest();return xmlHttp; }
  catch (e) { try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");return xmlHttp; }
  catch (e) { try { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");return xmlHttp; }
  catch (e) { alert("¡Tu navegador no soporta AJAX!");return false; }
  }}}
	
	function carga(){
		for(i=1;i<6;i++){
			content = 'ipaso'+i;
			document.getElementById(content).style.height = 0 + 'px';
			xDisplay(content, "none");
		}
		xDisplay('loading', 'none');
		xDisplay('ipaso0', 'block');
	}
	
	var t;
	var i;
	var pactual;
	var puede;
	var type;
	function oculta(divid){
		var infodiv = document.getElementById(divid);
		infodiv.style.height = infodiv.offsetHeight + 'px';// establesco la altura por que js no la lee a menos que haya sido establecida antes.
		i=setInterval(function(){ redimenciona(0, divid); }, 100);
	}
	
	function muestra(divid, height){
		var infodiv = document.getElementById(divid);
		infodiv.style.height = infodiv.offsetHeight + 'px';// establesco la altura por que js no la lee a menos que haya sido establecida antes.
		i=setInterval(function(){ redimenciona(height, divid); }, 100);
	}
	
	function redimenciona(limite, divid){
		var infodiv = document.getElementById(divid);
		inicial = parseInt(infodiv.style.height);
		
		actual = Math.ceil((limite - inicial)/4);
		inicial += actual;
		infodiv.style.height = inicial + 'px';
		if(parseInt(infodiv.style.height) >= (limite - 5) && parseInt(infodiv.style.height) <= (limite + 5)){
			clearInterval(i);
			infodiv.style.height = limite + 'px';
		}
	}
		
		function go_paso(paso, height){
			clearTimeout(t);
			switch(paso){
				case 1:
					if(document.getElementById('infobase').checked !== true){
						puede = false;
						alert("Debes leer la información y las bases del sorteo y ser mayor de dieciséis años para continuar con el proceso de inscripción. Si cumples todo esto, marca la casilla que encontrarás en el cuadro amarillo.");
					}else{
						puede = true;
					}
				break;
				
				case 2:
					element = document.getElementById('type');
					type = element.options[element.selectedIndex].value;
					puede=true;
				break;
				
				case 3:
					puede=true;
				break;
				
				case 4:
					puede=true;
				break;
				
				case 5:
					puede=true;
				break;
			}
				if(puede == true){
					clearTimeout(t);
					if(pactual == 4){
						content = 'ipaso4';
					}else{
						if(paso<pactual){
							content = 'ipaso' + (paso+1);
						}else{
							content = 'ipaso' + (paso-1);
						}
					}
					oculta(content);
					t=setTimeout(function(){ espera(paso, height); },2500);
					puede=false;
				}
		}
		
		function espera(paso, height){
			xDisplay('loading', 'block');
			clearTimeout(t);
			if((paso !== 4) && (paso !== 3)){
				guarda_datos(paso, height);
			}else{
				t=setTimeout(function(){ ir_a_paso(paso, height); },3500);
			}
		}
		
		function get_height(paso){
			if(paso == 1){
				return 750;
			}else if(paso == 2){
				return 1300;
			}else if(paso == 3){
				return 450;
			}else if(paso == 0){
				return 450;
			}
		}
		
		function guarda_datos(paso, height){
			var ajax = new newAjax();
			ajax.open("POST", "http://beta.blogosferaxl.com/sorteo/ajax.php", true);
			ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			switch(paso){
				case 1:
					ajax.send("paso="+paso+"&infobase="+document.getElementById('infobase').value);
				break;
				
				case 2:
					mensaje = "paso="+paso+"&nombre="+document.getElementById('nombre').value+"&email="+document.getElementById('email').value+"&type="+document.getElementById('type').options[document.getElementById('type').selectedIndex].value+"&title="+document.getElementById('title').value+"&url="+document.getElementById('url').value;
					alert(mensaje);
					ajax.send("paso="+paso+"&nombre="+document.getElementById('nombre').value+"&email="+document.getElementById('email').value+"&type="+document.getElementById('type').options[document.getElementById('type').selectedIndex].value+"&title="+document.getElementById('title').value+"&url="+document.getElementById('url').value);
				break;
				
				case 5:
					ajax.send("paso=4");
				break;
			}

			ajax.onreadystatechange=function(){
				if (ajax.readyState==4){
					var respuesta = ajax.responseText;
					if(respuesta == "continue"){
						t=setTimeout(function(){ ir_a_paso(paso, height); },3500);
					}else{
						t=setTimeout(function(){ ir_a_paso(pactual, get_height(pactual)); },3500);
					}
				}
				ajax.onreadystatechange=null;
			}
		}
		
		function ir_a_paso(paso, height){
			pactual = paso;
			content = 'ipaso' + paso;
			xDisplay('loading', 'none');
			xDisplay(content, 'block');		
			muestra(content, height);
			clearTimeout(t);
			if(paso == 3){
				t=setTimeout(function(){ comprobar_url(); },3500);
			}
		}
		
		function comprobar_url(){
			var ajax= new newAjax();
			ajax.open("POST", "http://beta.blogosferaxl.com/sorteo/ajax.php", true);
			ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			ajax.send("paso=3&links="+document.getElementById('links').value);

			ajax.onreadystatechange=function(){
				if (ajax.readyState==4){
					var respuesta = ajax.responseText;
					if(respuesta == "continue"){
						t=setTimeout(function(){ go_paso(4, 850); },3500);
					}else{
						t=setTimeout(function(){ go_paso(2, 1300); },3500);
					}
					ajax.onreadystatechange=null;
				}
			}
		}
Los botones siguiente y anterior llaman a la función go_paso(..), y carga() se ejecuta al iniciar la página. A partir de ahí ya se puede ir viendo todo como evoluciona.

Por los errores de IE, las líneas que fallan son las que cambian el estilo de los elementos (overflow, display, height, etc), pero no se me ocurre otra manera de hacerlo. El código tiene que estar correcto, si no no funcionaría en el resto de navegadores, ¿no?

Gracias por leer hasta aquí. A ver si a alguien se le enciende la bombilla más que a mi.

Saludos
  #2 (permalink)  
Antiguo 09/08/2008, 06:54
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: Mostrar y ocultar capas con Javascript

Hola

Añade esta función

Cita:
var ns6 = (document.getElementById)? true:false
var ie4 = (document.all)? true:false
var ns4 = (document.layers)? true:false
function captura_objeto(idnombre) {
if (ns6)
{
return document.getElementById(idnombre);
}
else if (ie4)
{
return document.all[idnombre];
}
else if (ns4)
{
return document.layers[idnombre];
}
else
{
return null;
}
}
Ahora esta otra función quedaría

Cita:
function oculta(divid){
var infodiv = captura_objeto(divid);
infodiv.style.height = infodiv.offsetHeight + 'px';// establesco la altura por que js no la lee a menos que haya sido establecida antes.
i=setInterval(function(){ redimenciona(0, divid); }, 100);
}
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #3 (permalink)  
Antiguo 10/08/2008, 12:09
Avatar de Cristiaen  
Fecha de Ingreso: enero-2008
Mensajes: 29
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Mostrar y ocultar capas con Javascript

Hola,

He probado a insertar esa función y a modificar la que me comentas y muestra(..), pero sigue sin funcionar. He detectado que los errores los da donde está la función captura_objeto(), y sigo sin entender por qué...

Muchísimas gracias por tu aportación, de verdad.

Saludos
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 23:58.