2010-03-16 19 views
18

Tenemos la siguiente situación, que va desde un único dominio:última ventana abierta por window.open

Página A window.open() utiliza para abrir una ventana llamada (un jugador emergente). window.open() le da a la página A una referencia a la ventana.

El usuario vuelve a cargar la página A. Se pierde la referencia a la ventana nombrada. Usar window.open() para "encontrar" la ventana tiene el desafortunado efecto secundario de volver a cargarla (no deseable). ¿Hay alguna otra forma de obtener una referencia a esta ventana?

+0

wow hay otra pregunta casi igual a esta abierta esta mañana. – Pointy

+2

¿Puedes publicarlo aquí? No pude encontrarlo – spender

Respuesta

23

Prueba esto:

var playerUrl = 'http://my.player...'; 
var popupPlayer= window.open('', 'popupPlayer', 'width=150,height=100') ; 
if(popupPlayer.location.href == 'about:blank'){ 
    popupPlayer.location = playerUrl ; 
} 
popupPlayer.focus(); 

se abrirá una ventana en blanco con un nombre único. Como la URL está en blanco, el contenido de la ventana no se volverá a cargar.

+0

Esto se ve genial. Lo intentaré cuando tenga oportunidad. – spender

+0

Esto hizo el truco. Tu rock Gracias. – spender

+2

En lugar de popupPlayer.location, recomiendo usar popupPlayer.location.href. Esto evita problemas cuando se usa === en lugar de == (por ejemplo, CoffeeScript lo hace automáticamente). – Philipp

0

En realidad, lo que hizo fue destruir el elemento primario (página A) de la ventana creada (Popup), por lo que no tiene más referencias al elemento primario original, por lo tanto no puede obtener una referencia directa.

La única solución que puedo pensar es usar un navegador que le ofrece la capacidad javascript agregada para recorrer ventanas activas (pestañas) y encontrar una que tenga una propiedad especial (es decir, su página recargada A) que sea reconocida por el surgir.

Desafortunadamente, supongo que solo Firefox tiene alguna capacidad adicional o extensión que le da esta flexibilidad. (Que también es un riesgo de seguridad, aunque)

+0

Sin dados. Necesita ser x-navegador. – spender

+0

Es un "no ir" entonces. :( – OverLex

1

yo sepa, no hay ninguna ..

A de tipo de sucia, pero-i-supongo-que-voluntad-de trabajo truco sería la de restablecer periódicamente la referencia en la ventana padre desde el interior de la ventana emergente usando window.opener, con algo parecido a este código:

 

    setInterval(function() { 
     if(window.opener) { 
      window.opener.document.myPopupWindow = window 
     } 
    }, 100) 

en la ventana principal, podrás acceder a la document.myPopupWindow, incluso después de una recarga (también , 100ms después de la recarga). Esto debería funcionar en el navegador cruzado.

+4

I duda un poco window.opener seguirá siendo una referencia válida después de la recarga ... – Alsciende

+0

Es, he comprobado. Cuando la ventana de apertura está cerrada, tendrías 10 nullpointers por segundo con el código anterior. Lo modifiqué para comprobar null :) –

+0

buen código, entonces. – Alsciende

1

Esto debería funcionar. Agregue este código en la ventana emergente:

function updateOpener() { 
    if (window.opener) 
     window.opener.document.myPopupWindow = window; 
    else 
     setTimeout(updateOpener, 100); 
} 

updateOpener(); 

Y esto en la carga de la ventana principal. Para asegurarse de que myPopupWindow se haya configurado, espere 100 ms antes de acceder a él.

setTimeout(function() { 
    if (document.myPopupWindow) 
     document.myPopupWindow.focus(); 
}, 100); 
Cuestiones relacionadas