Foros del Web » Programando para Internet » Javascript »

¿Alguna forma de cerra ventanas mediante el nombre dado en vez de la instancia?

Estas en el tema de ¿Alguna forma de cerra ventanas mediante el nombre dado en vez de la instancia? en el foro de Javascript en Foros del Web. Hola: Tengo una aplicación que necesita abrir varios popups para ir dando de alta distintos elementos. Cuando doy de alta algo se van refrescando los ...
  #1 (permalink)  
Antiguo 07/03/2011, 15:59
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 1 mes
Puntos: 1
¿Alguna forma de cerra ventanas mediante el nombre dado en vez de la instancia?

Hola:

Tengo una aplicación que necesita abrir varios popups para ir dando de alta distintos elementos. Cuando doy de alta algo se van refrescando los elementos que hay en las ventanas padre y se mantienen los popups abiertos (gustos del cliente).

También he creado una función javascript recursiva de manera que cuando una ventana padre se cierra o se hace un volver a la página anterior, mediante una accion de struts, no con los botones de history back, recorre las posibles ventanas hija y las posibles hijas de cada una de estas, cerrandolas todas.

El método que utilizo es el clásico, ventana = window.open..., más o menos como el que se utiliza en el wiki de apertura y cierres de ventanas que esta en

http://www.forosdelweb.com/wiki/Javascript:_Cerrar_todas_las_ventanas

El problema que tengo y que he visto en la wiki también es que cuando realizas cualquier acción que implique un refresh o un submit, las referencias a esos window.open se pierden, por lo que luego es imposible cerrarlas haciendo referencia a nombreventana.close().

Sin embargo, hay una parte del window.open que es el nombre de la propia ventana, por ejemplo, popupArtículo, mediante el cual, si yo desde cualquier sitio intento abrir otra ventana con ese mismo nombre, y esta ya existe, se utilizará este popup para abrir el nuevo contenido en vez de crearse otra nueva.

Después de todo este rollo, la pregunta es si hay alguna forma de cerrar ventanas hija a través del nombre con el que se abre, en vez de utilizar el nombre de la variable javascript con el que se ha creado, ya que este al refrescar se ha perdido.

A lo mejor hay que utilizar el objeto navigator en vez del objeto window para encontrar esas referencias por nombre de popup pero no estoy seguro de si se puede hacer así. Si alguien tiene idea de cómo realizar este cierre de ventanas en cadena, una vez hacemos un refresco de una o varias de las ventanas abiertas y que hemos perdido las referencias del objeto window, le agradecería que me dijera cómo hacerlo o al menos por dónde van los tiros para solucionarlo.

A mi lo único que se me ocurre es intentar preservar esas referencias mediante parámetros pero probablemente sería para volverse loco.

Un saludo y gracias.
  #2 (permalink)  
Antiguo 07/03/2011, 17:31
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 10 meses
Puntos: 834
Respuesta: ¿Alguna forma de cerra ventanas mediante el nombre dado en vez de la insta

Lamentablemente no hay manera de hacer lo que querés (o mejor dicho, no se me ocurre ninguna manera). Y navigator es un objeto dependiente de window, así que tampoco es una opción. Lo que podrías hacer es cerrar todas las ventanas usando el evento onbeforeunload de la ventana principal.
Eso, o chequear desde cada ventana cada x segundos que exista y esté definida la propiedad opener. El resto de las opciones ya serían involucrando algún lenguaje de servidor.
  #3 (permalink)  
Antiguo 07/03/2011, 17:49
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
Puntos: 1485
Respuesta: ¿Alguna forma de cerra ventanas mediante el nombre dado en vez de la insta

buenas...

creo que la mejor manera es la que expone panino, revisar la existencia de padre por cada intervalo. como curiosidad o dato extra en como el padre puede recuperar la referencia de las ventanas hijas. al menos en chrome me funciona, no he intentado en los demas. consiste en volver a crear el popup con el mismo nombre de la ventana pero con una url vacia para que la ventana hija se mantenga en la pagina actual. sin embargo, hay al menos dos contraparte. la primera e importante es que el navegador podria bloquear la creacion de la instancia. me he fijado que en chrome se puede recuperar la instancia siempre y cuando indiques el nombre de la ventana y dicha ventana este abierta. la otra contraparte no es tan complicada, se trata que tendrias que mantener referencia sobre los nombres de las ventanas y que estas esten disponible durante la navegacion. puedes usar cookies o local storage para este proposito.


actualizacion: hice las pruebas en firefox e iexplorer, en ambos me funciona el modelo descrito.

__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 07/03/2011 a las 18:18
  #4 (permalink)  
Antiguo 09/03/2011, 15:33
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: ¿Alguna forma de cerra ventanas mediante el nombre dado en vez de la insta

Hola de nuevo:

En primer lugar, gracias a los dos por las respuestas. Al final, he resuleto mi problema utilizando parámetros y la llamada a window.open con una url vacía.

El código que he utilizado, por si a alguien le sirve, es el siguiente:

Código:
function controlarPopupsAbiertos(valor, poner){
	var popupsAbiertos = document.forms[0].popupsAbiertos.value;
	if (popupsAbiertos == 'null'){
		popupsAbiertos = '';
	}
	if (poner) {
		if (popupsAbiertos == null || popupsAbiertos == ''){
			popupsAbiertos = valor;
		}else if (popupsAbiertos.indexOf(valor) == -1){
			popupsAbiertos = popupsAbiertos + ',' + valor;
		}
	} else { //quitamos el elemento
		if (popupsAbiertos != null && popupsAbiertos != '' && popupsAbiertos.indexOf(valor) != -1){
			var posicion = popupsAbiertos.indexOf(valor);
			if (posicion == 0){
				if(popupsAbiertos.length == valor.length)
					popupsAbiertos = '';
				else
					popupsAbiertos = popupsAbiertos.substring(valor.length + 1);
			} else{
				if (posicion + valor.length == popupsAbiertos.length)
					popupsAbiertos = popupsAbiertos.substring(0, posicion - 1);
				else
					popupsAbiertos = popupsAbiertos.substring(0, posicion) + popupsAbiertos.substring(posicion + valor.length + 1);
			}
		}
	}
	document.forms[0].popupsAbiertos.value = popupsAbiertos;
}
Esta primera función, va almacenando en un hidden propio de cada ventana las subventanas que se abren o se cierran. Añado cuando llamo a un window.open y elimino al cerrar una ventana desde una función que se llama mediante el evento onBeforeUnload.

Código:
function comprobarHijosAbiertos (ventanaPadre, ventanasHijas, pedirConfirmar){
	var hayAbiertas = false;
	var hijas = ventanasHijas.split(',');
	var llamadaDesdePadre;
	var objVentana;
	var popupAbiertos;
	if (hijas != null && hijas.length > 0){
		var continuar = true;
		if (pedirConfirmar)
			continuar = confirm ("Antes de realizar la operaci?n solicitada debe cerrar todas las ventanas dependientes de la actual. ?Desea continuar?");
		if (continuar){		
			for (var i = 0; i < hijas.length; i++){
				popupAbiertos = '';
				llamadaDesdePadre = ventanaPadre + '.' + hijas[i];
				objVentana = window.open('', eval("'" + hijas[i] + "'"),'resizable=no,scrollbars=yes,status=no,top=50,left=100,height=300, width=740');
				objVentana.focus();
				if (objVentana.document.forms[0] != null){
					if (objVentana.document.forms[0].popupsAbiertos != null)
						popupAbiertos = objVentana.document.forms[0].popupsAbiertos.value;
					if (popupAbiertos != null && popupAbiertos != '' && popupAbiertos != 'null'){
						comprobarHijosAbiertos(llamadaDesdePadre + '.window', popupAbiertos, false);
					}
					ventana = llamadaDesdePadre + '.close()';
					objVentana.close();
				}else
					objVentana.close();
			}
		} else
			hayAbiertas = true;
	}
	return hayAbiertas;
}
Esta segunda función es la que se encarga de cerrarlo todo de manera recursiva si una subventana abre a su vez otras subventanas.


Todo esto se podría reducir creando una variable en las jsp con los nombres de los posibles popups, en vez de jugar con un hidden, lo que nos ahorraría la primera función y el tener que preocuparnos por mantener el hidden.

Si la ventana ya estaba abierta, existirá el objeto window.document.forms[0] y tendremos que comprobar si esta subventana ha abierto otras. Si lo ha echo se bajará a ese nivel y se cerrarán todas las ventanas dependientes y al salir cerrará la subventana en la que estamos. Si no estaba abierta la ventana y la hemos creado, entonces window.document.forms[0] no existirá, por lo que tampoco habrá subventanas y simplemente cerramos la subventana actual.

Espero haberme explicado y que esto sea útil para alguien.

Un saludo.

Etiquetas: dado, instancia, nombre, ventanas, formulario
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 07:35.