2010-07-22 61 views
26

Si abre una ventana como:Javascript Trae la ventana al frente si ya está abierta en window.open?

window.open ("url","winName","location=0,width=300,height=214"); 

Si winName ya está abierto sólo cambia la dirección URL en la ventana. Esto está bien, pero si esa ventana está detrás de la ventana actual, la mayoría de los usuarios no se darán cuenta de esto y pensarán que simplemente no se está abriendo.

¿Hay alguna forma de que si la ventana ya está abierta, la lleva al frente?

+0

posible duplicado de [Uso de JavaScript, ¿Cómo llevar una ventana abierta ya existente en la parte delantera en la parte superior de otras ventanas de otro código ventanas?] (Http: // stackoverflow.com/questions/2530572/using-javascript-how-do-i-bring-an-already-existing-open-window-to-the-front-on) –

+2

@Andy en esa pregunta, el usuario se pregunta cómo traiga la ventana del abridor/padre al frente desde la ventana del niño/abierta. Estoy preguntando cómo hacerlo a la inversa. Traiga al niño/ventana abierta al frente desde la ventana principal/de apertura. Si eso tiene sentido. –

+0

lo siento. He visto esta pregunta antes, sin embargo, simplemente no puedo encontrarla ahora :-) –

Respuesta

2

window.focus() aplicado a la ventana en cuestión debería hacer el truco.

+0

¿Puede darme un ejemplo? Intenté: 'editDaySched = window.open (...); editDaySched.focus(); 'en Chrome, pero no parece funcionar. Gracias. –

+0

Si llamas a focus() en línea de esa manera, no funcionará porque la ventana aún no existe. Lo que debe hacer es tener una función en la ventana abierta (aquí editDaySched) que llama a window.focus() cuando el evento onload se dispara. Puede hacer una prueba de concepto desde el abridor con un setTimeout enfocando la ventana editDaySched después de, digamos, 5 o 6 segundos. – Robusto

44

Actualización: Esto no ha funcionado desde Chrome (21+). La solución es cerrar/volver a abrir. El método window.open() devuelve un objeto que representa la nueva ventana. Sólo tiene que window.focus() que:

var w = window.open ("url","winName","location=0,width=300,height=214"); 
w.focus(); 

O simplemente:

window.open("url","winName","location=0,width=300,height=214").focus(); 
+2

Esto solo funcionará en IE si la ventana emergente no tiene otras pestañas del navegador abiertas en el mismo host de la aplicación. Incluso si la ventana emergente tiene foco sobre las otras pestañas, simplemente fallará silenciosamente en IE9, probablemente también en versiones anteriores. Afortunadamente (?), Al deshabilitar la pestaña emergente de un grupo de pestañas se conserva la referencia correcta de la ventana del host, y se reanudará comportándose como se esperaba. –

+0

trabajo en Chrome - thnks – Guihgo

7

actualización: Esto no ha trabajado desde Chrome (21+). La solución es cerrar/volver a abrir.

Tenga cuidado, porque cuando abre una nueva ventana, la ventana de apertura aún puede tener algún código para ejecutarse, tal vez parte de este código le da el foco. Vería cómo se abre la nueva ventana en el frente y de repente pasa a la parte posterior, por lo tanto, es una gran idea en estos casos, establecer un tiempo de espera para dar el enfoque a la nueva ventana un poco más adelante, cuando todos el código JavaScript en la ventana de apertura se ejecuta, puede hacerlo de esta manera:

setTimeout(function(){window.focus();},1000); 

Ser 1000 la cantidad de milisegundos a esperar, y la ventana el nombre de la ventana abierta. También podría usar este código en la ventana abierta en la carga del cuerpo, por ejemplo.

+0

¡Gracias! Esto resolvió un problema a largo plazo que tuve. –

7

Las diversas respuestas que sugieren utilizar cualquier forma de .focus() probablemente no van a funcionar en todos los navegadores.

Esta solía funcionar en el pasado pero no más, principalmente debido a que los navegadores trabajan para evitar que las redes publicitarias oscuras empujen sus anuncios emergentes al primer plano.

En Mozilla Firefox en particular (dependiendo de su versión) hay una configuración configurada por defecto que impide que otras ventanas (por ejemplo, ventanas emergentes) se enfoquen.

Puede encontrar esta configuración en la página about:config (¡pise con cuidado!)

dom.disable_window_flip: true

Si no recuerdo mal este ajuste se llamaba algo así como ~ "allow_raise_or_lower_windows *

otros navegadores puede implementar algo similar, sino simplemente si 1 de los navegadores principales bloquea el uso de .focus() de forma predeterminada, entonces no hay mucho uso al intentar llamarlo.

Como resultado, la única solución que he visto que funciona es ver si la ventana existe, y todavía no está cerrada ... y si la cierra, cargue la ventana que desea.

function closePopupIfOpen(popupName){ 
    if(typeof(window[popupName]) != 'undefined' && !window[popupName].closed){ 
    window[popupName].close(); 
    } 
} 

al abrir su ventana emergente si hay una posibilidad de que ya está abierto (y enterrado detrás de otras ventanas), entonces puede llamar a esta función antes de intentar abrir la ventana emergente.

closePopupIfOpen('fooWin'); 
var fooWin = window.open('someURL', 'foo', '...features...'); 

El inconveniente, por supuesto, es que si había algo (por ejemplo, una forma parcialmente llenado) "importante" en esa ventana se perderá.

+0

funciona en cromo pero no parece que tenga ningún efecto en IE11 – Samuel

3

i fijo esto añadiendo

onclick="myWin = window.open('','winName','location=0,width=300,height=214'); myWin.focus()" 

al elemento html (botón) y luego cambiar la URL a través de JS.

+0

funciona muy bien en Chrome no se ha probado en otros navegadores – relipse

0

Puede usar jQuery:

myPopup = window.open(url, "Title","menubar=no, status=no, scrollbars=no, menubar=no, width=800, height=800"); 
$(myPopup).focus(); 
+1

jquery focus es solo una envoltura para el método focus() estándar, así que no hay ningún beneficio. Además, el OP no solicitó una solución jQuery – Liam

Cuestiones relacionadas