Foros del Web » Programando para Internet » Javascript »

Cerrar Ventanas hijas al cerrar ventana madre y colocar focus a ventana hija abierta

Estas en el tema de Cerrar Ventanas hijas al cerrar ventana madre y colocar focus a ventana hija abierta en el foro de Javascript en Foros del Web. Tengo un código que tomé de este foro que por medio de una ventana principal abre n cantidad de ventanas hijas (popus) y valida si ...
  #1 (permalink)  
Antiguo 18/06/2005, 16:32
Avatar de Roly1978  
Fecha de Ingreso: junio-2005
Mensajes: 18
Antigüedad: 18 años, 10 meses
Puntos: 0
Cerrar Ventanas hijas al cerrar ventana madre y colocar focus a ventana hija abierta

Tengo un código que tomé de este foro que por medio de una ventana principal abre n cantidad de ventanas hijas (popus) y valida si esta última está o no abierta. Si está abierta le coloca un focus y si está cerrada la abre.

Cuando la ventana madre se cierra, todas las ventanas hijas lo hacen con ella....El código, en términos generales funciona bien, pero:

El problema es el siguiente: Cuando cierro manualmente la ventana hija y la vuelvo a llamar mediante la ventana principal, me genera un error debido a que una variable no se reinicializa para indicar que esta fue cerrada....Ojalá alguien tenga la solución a este pequeño inconveniente....A continuación el código:


Obviamente en todas las ventanas (principal e hijas) se hace referencia al archivo .inc
Archivo .inc:
<script language="JavaScript" type="text/JavaScript">
<!--
var ventana=new Array();
var P01=0;
//************************************************** *
function abreVentana(pagina,cont)
{
if (pagina=='Z_01.asp')
{
if (P01==0) //El valor de esta variable indica si la página está o no abierta (0=cerrada 1=Abierta). En este caso ejecuta lo que sigue si está cerrada
{
eval('ventana'+ cont + "=window.open(pagina,'ventana'+cont,'toolbar=no,me nubar=no,resizable=yes, scrollbars=yes,width = 700, height=460,top=50,left=50')");
P01=1;
}
else //Si está abierta (p01=1) entonces le hace un focus..
{
eval('ventana'+cont+".focus()");
}
}
return false;
}
//*********************************************
function Cerrar() //Cierra todas las ventanas hijas al cerrar la madre
{
for(m=1;m<=100;m++)
{
if(eval('ventana' + m))
{
eval('ventana' + m + ".close()");
}
}
}
//****************************************
function CerrarUnica(Cadena) //Supuestamente al cerrar la ventana hija de forma individual se deberia reinicializar la variable a 0 pero de alguna forma la considera como otra variable
{
eval('Cadena'+"=0");
}
//-->
</script>

Página Principal
<a href="Z_01.asp" onClick="abreVentana('Z_01.asp',1);return false;">Ventana N° 1</a><br>

Ventana Hija:

<body onUnload="CerrarUnica('P01')">

Última edición por Roly1978; 18/06/2005 a las 16:39
  #2 (permalink)  
Antiguo 18/06/2005, 18:03
Avatar de Roly1978  
Fecha de Ingreso: junio-2005
Mensajes: 18
Antigüedad: 18 años, 10 meses
Puntos: 0
Ya encontré el problema

Si a alguien le está pasando lo mismo, voy a publicar la respuesta. Hace 5 minutos que acabo de encontrar la solución:

A mi parecer, esto es lo que sucedió (corrijanme si estoy equivocado):
La ventana madre hace mención al archivo .inc por medio de un include ¿Cierto? y la ventana hija también tiene dentro de su código el include del mismo archivo...... ¡Que tonto soy....!, es decir soy novato en esto, pero este tipo de error quizás nada más lo he cometido yo.............pero bueno....como dicen por allí.son gajes del oficio....


Lo que sucede es que al hacer referencia al mismo archivo desde dos lugares diferentes se crean dos instancias del mismo código .inc y por ende todas las variables de la ventana madre son totalmente distintas a las de la ventana hija.....la forma correcta de referirse al mismo archivo desde dos lugares diferentes (en este caso la ventana madre e hija), es que la ventana madre sea quien haga el llamado al archivo .inc y entonces, la ventana hija haga referencia a la ventana madre por medio del .opener.

Es decir, que en lugar de la barrabasada que tenía anteriormente en la ventana hija (<body onUnload="CerrarUnica('P01')">) se debe poner <body onUnload="opener.CerrarUnica('P01')"> y que esta ventana (la hija) no haga referencia al archivo .inc y listo, problema resuelto.......Que bestia eres Roly....Pero bueno, ya resolví el problema.......
  #3 (permalink)  
Antiguo 19/06/2005, 03:14
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Qué al Roly1978,

el script que estás usando (el original) yá contempla (o contemplaba) la posibilidad de que una ventana hija se cierre en forma manual para no dar error y continuar con el proceso normalmente.

No sé por qué le has hecho esos cambios. Has quitado líneas imprescindibles para el correcto funcionamiento del script, por eso te ha estado funcionando mal.

Dejando el script tal cual es el original (incluyendo sus créditos también) obentadrías lo mismo con menos líneas y sin tener que agregar código a los documentos que se cargan dentro de las popup
  #4 (permalink)  
Antiguo 19/06/2005, 05:33
Avatar de Roly1978  
Fecha de Ingreso: junio-2005
Mensajes: 18
Antigüedad: 18 años, 10 meses
Puntos: 0
Que tal Tunai
Tienes Razón al decir que el código que publicaste, permite cerrar las ventanas manualmente, pero en lo que necesitaba estaba incompleto, y te diré porque:

Al abrir el link 1 que hace referencia a la página 01.htm efectivamente se abría el popup de esa página, pero al hacer click nuevamente al mismo link (con el popup 01.htm abierta), lo que sucedía era que se abría otra ventana de la misma página, y esa es la parte que no me gustaba de tu código.

Yo necesito que la ventana madre sepa cual de sus hijas están cargadas y cuales no y realizar cualquiera de las dos funciones (open o focus) de acuerdo a su estatus..

Pero si te das cuenta, y de hecho ya lo hiciste.....he utilizado el 99% de tu código, lo cual te agradezco porque me evitaste tener que inventar 2 veces la rueda, y por los créditos no te preocupes, los omité aquí por cuestiones de espacio, pero en la página principal del site que estoy desarrollando lo contempla....

Ahora si me puedes ayudar a hacer más limpio este código te lo agradeceré mucho...Apenas llevo un par de semanas lidiando con javascript, así que se que este código hay que depurarlo bastante....

Es más pruébalo, dime que te parece y si te gusta complementalo con el tuyo, si de hecho este código es tuyo, así que.....

Suerte y gracias
  #5 (permalink)  
Antiguo 19/06/2005, 09:55
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
En este caso es cuestión de guardar los identificadores de las ventanas asignándolos desde el propio link que llama a la función.

Con pocos retoques queda así

Código:
<script type="text/javascript"> 
//cerrar todas las ventanas. Script por tunait!
//http://javascript.tunait.com/
//[email protected]
var lVentanas  = new Array()
function abreVentana(pagina,id){
	e = false
	for(t = 0; t < lVentanas.length; t++){
		if(lVentanas[t]== id){
			e = true;
			eval(lVentanas[t]).focus()
			break;
		}
	}
		eval(id+"=window.open(pagina,'" + id + "','width=100,height=100')")
		if(!e){
			lVentanas[lVentanas.length] = id
		}
}
function cerrar(){
	for(m=0;m<lVentanas.length;m++){
	  if(eval(lVentanas[m])){
		eval(lVentanas[m]).close()
		}
	  }
	lVentanas.length = 0
}
</script>
Código:
<a href="http://www.forosdelweb.com" onclick="abreVentana('http://www.forosdelweb.com','id1');return false" >forosdelwé</a>

<a href="http://www.yahoo.es" onclick="abreVentana('http://www.yahoo.es,'id2');return false">Yahoo españa</a>
...y a body...

<body onunload="cerrar()>

le agregas el segundo parámetro a la llamada a la función. Puedes llamarlos id1 id2 o pericodelospalotes, funcionará igual

Yá me contarás
  #6 (permalink)  
Antiguo 19/06/2005, 10:23
Avatar de Roly1978  
Fecha de Ingreso: junio-2005
Mensajes: 18
Antigüedad: 18 años, 10 meses
Puntos: 0
Casi funciona, solo le falta que cuando cierrre el popup manualmente, la página principal la vuelva a abrir nuevamente como popup.......
__________________
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!Por respeto evitemos pedir respuestas a un e-mail y tampoco hagamos preguntas por Mensajes Privados o por e-mail.
  #7 (permalink)  
Antiguo 19/06/2005, 10:35
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
oño es verdad ...

ahora creo que sí

Código:
<script type="text/javascript"> 
//cerrar todas las ventanas. Script por tunait!
//http://javascript.tunait.com/
//[email protected]
var lVentanas  = new Array()
function abreVentana(pagina,id){
	e = false
	for(t = 0; t < lVentanas.length; t++){
		if(lVentanas[t]== id){
			e = true;
			break;
		}
	}
	eval(id+"=window.open(pagina,'" + id + "','width=100,height=100')")
	eval(id).focus()
	if(!e){
		lVentanas[lVentanas.length] = id
	}
}
function cerrar(){
	for(m=0;m<lVentanas.length;m++){
	  if(eval(lVentanas[m])){
		eval(lVentanas[m]).close()
		}
	  }
	lVentanas.length = 0
}
</script>
...yá me contarás
  #8 (permalink)  
Antiguo 19/06/2005, 10:44
Avatar de Roly1978  
Fecha de Ingreso: junio-2005
Mensajes: 18
Antigüedad: 18 años, 10 meses
Puntos: 0
Listo.........Caso cerrado.........Muchas gracias....
__________________
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!Por respeto evitemos pedir respuestas a un e-mail y tampoco hagamos preguntas por Mensajes Privados o por e-mail.
  #9 (permalink)  
Antiguo 19/06/2005, 11:19
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Estupendo


... por cierto, hoy ha sido tu estreno por estos foros ¿no?
  #10 (permalink)  
Antiguo 20/06/2005, 10:46
Avatar de Roly1978  
Fecha de Ingreso: junio-2005
Mensajes: 18
Antigüedad: 18 años, 10 meses
Puntos: 0
Así es.........lo acabo de encotrar y me parece caido del cielo.......no tienes todo lo que he podido aprender en un solo día..........
__________________
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!Por respeto evitemos pedir respuestas a un e-mail y tampoco hagamos preguntas por Mensajes Privados o por e-mail.
  #11 (permalink)  
Antiguo 20/06/2005, 11:30
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
..jeje sí, recuerdo haber tenido la misma impresión cuando llegué por primera vez

Pues bienvenido a los foros Roly1978
  #12 (permalink)  
Antiguo 08/08/2005, 20:15
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1
Antigüedad: 19 años, 4 meses
Puntos: 0
Que codigo va en la ventana PRINCIPAL (madre) y cual(es) codigo(s) va en la ventana(s) Hija(s)

Saludos
  #13 (permalink)  
Antiguo 10/02/2009, 13:19
Avatar de drac94  
Fecha de Ingreso: mayo-2008
Ubicación: México
Mensajes: 383
Antigüedad: 16 años
Puntos: 5
Respuesta: Cerrar Ventanas hijas al cerrar ventana madre y colocar focus a ventana hi

muy buen tema, todo funciona perfecto, solo un pequeño detalle, cuando una ventana ya esta abierta y se le vuelve dar al link, no la abre de nuevo solo la muestra pero lo q si hace es q la recarga, hay alguna forma de q solo se muestre y no se recargue, otra cosa es q en el mozilla el metodo focus solo funciona la primera vez, si ya esta abierta y le das al link solo se ve como se recarga pero no se muestra, ¿sera xq en el mozilla en ves de ventanas abre pestañas o no tiene nada q ver?
  #14 (permalink)  
Antiguo 10/02/2009, 13:28
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 2 meses
Puntos: 772
Respuesta: Cerrar Ventanas hijas al cerrar ventana madre y colocar focus a ventana hi

El mensaje original es de hace más de 3 años. Por favor, no reviváis temas tan antiguos.

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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 09:35.