Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/03/2011, 15:33
JaimeLG
 
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.