2011-01-24 14 views
12

He visto formas de ver si una ventana que se abrió una secuencia de comandos en particular todavía está abierta, pero ¿y si no fuera así?¿Cómo saber si existe una ventana en Javascript?

Tengo una pequeña ventana que tiene un botón para hacer clic para cargar la ventana grande. Cuando cierro el grande, quiero que se dispare un onUnload o onBeforeUnload en particular si el más pequeño está cerrado; si todavía está abierto, esos procedimientos no se dispararán. Puede que simplemente tenga un pedo cerebral masivo, pero no puedo averiguar cómo verificar si la otra ventana está abierta. El grande no lo está abriendo, así que no puedo simplemente grabar el mango para abrirlo.

En términos más cortos: si la ventana A abrió la ventana B, ¿cómo puedo verificar dentro de la ventana B si todavía existe la ventana A?

Respuesta

19
if(window.opener && !window.opener.closed) 
    alert('Yup, still there.'); 
+0

Oh. Bueno, eso fue simple. Aquí hay una pregunta de seguimiento, sin embargo ... si B se abrió independientemente de A, ¿se puede abrir B independientemente de A? A tener un nombre/objetivo particular y todo, no es como si tratara de adivinar lo que quiero decir con A, ¿sabe a qué me refiero con A. – Andrew

+0

window.parent? Eso es para marcos, no para ventanas emergentes –

+0

Oh, Dios. Gracias, Juan. Sí, quise decir 'abridor', no' padre'. Andrew: la clave relevante sería el argumento windowName para 'window.open', pero no tengo conocimiento de ninguna otra forma de usarlo que no sea otra llamada a' window.open', que es bastante destructiva. – chaos

17

window.closed se establecerá en cierto si usted hizo estallar una ventana y estaba cerrado (por el guión o usuario).

var win = window.open('...')'; 
if (win.closed) 

Su caso parece ser el siguiente:

Desde una ventana emergente, se puede comprobar si la ventana que se abre es todavía abierto usando window.opener.closed

Consigue manejar a una ventana por nombre

Mencioné que no hay forma de obtener el identificador de ventana por nombre en los comentarios. Sin embargo, investigué un poco y descubrí que los siguientes trabajos funcionan en FF/IE/Chrome; es un truco, no lo mencioné en ninguna parte como el comportamiento esperado, así que no confiaría mucho en él, ¡pero fue divertido descubrir que funciona! En mi código, solo me aseguraría de pasar los mangos necesarios.

//opened a window without storing a handle, but gave it a name 
window.open('/some/url', 'xxx'); 

// now I need to get a reference to that window 
// Calling open without setting a url gets you 
// a reference and doesn't reload the window 
var win = window.open('', 'xxx') 
+0

Gracias. ¿Qué pasa si se puede abrir de una manera que no sea a través del javascript original? (es decir, si C abrió B, ¿B puede ver si A está abierto?) – Andrew

+0

No, no puede "adivinar" el mango de una ventana. No hay un registro global de ventanas por nombre. En tu ejemplo, ¿C creó A? si lo hizo, debe almacenar ese identificador 'A = window.open(); B = window.open(); B.A = A''. Entonces B podría verificar 'if (! A.closed)'; –

+0

Gracias por el truco. Podría considerar usar eso, en realidad, pero ahora estoy tratando de hacerlo más limpio y formular una solución completamente de fondo. – Andrew

1

Use try {} y catch (err) {}.

try{ 
window.opener.document.body.getElementById('#elementId'); // do some action with window. opener 
} 
catch(err){ 
// if we are here then probably there is no window.opener 
window.close(); // closing this window or whatever you want 
} 
+0

Bueno, "probablemente no haya window.opener" no es una solución exacta.Esta pregunta tiene dos años y tiene una respuesta aceptada. En el futuro, por favor ponga su esfuerzo en nuevas preguntas o aquellos sin una respuesta aceptada;) – Mifeet

+1

@Mifeet esta respuesta no me satisfizo. Solo quería agregar una alternativa y tal vez una mejor solución si alguien como yo viniera aquí. Y no hay nada gracioso sobre "probablemente". Debido a que catch puede activarse no solo si window.opener no existe, sino también cuando el código que trata con window.opener no es válido. – Audrius

+1

Ok, gracias por la aclaración. Sin embargo, el uso de un try-catch no es una práctica recomendada, las excepciones se deben usar para estados excepcionales, no para el flujo de ejecución normal. Probar si 'window.opener' está configurado es una mejor solución. – Mifeet

Cuestiones relacionadas