2012-02-20 14 views
7

Cuando se crea una nueva ventana del navegador, se le pasa un nombre como este:JavaScript - Ventana del navegador de referencia por nombre?

myWindow = window.open('http://www.google.com', "googleWindow"); 

Más tarde se puede acceder a la ventana de la variable que lo guardó como:

myWindow.close(); 

¿Es posible acceder y manipular una ventana por su nombre (googleWindow) en lugar de la variable?

Si no es posible, ¿cuál es el punto que da nombres de ventanas?

Respuesta

17

No. Sin una referencia a la ventana, no puede encontrarla de nuevo, por nombre o de otro modo. No hay una colección de ventanas.

ACTUALIZACIÓN: Así es como se podría hacer usted mismo:

var windows = {}; 
function openWindow(url, name, features) { 
    windows[name] = window.open(url, name, features); 
    return windows[name]; 
} 

Ahora, openWindow siempre habrá abrir la ventana, y si la ventana ya existe, se carga la URL dada en esa ventana y el retorno una referencia a esa ventana. Ahora también se puede aplicar findWindow:

function findWindow(name) { 
    return windows[name]; 
} 

que devolverá la ventana si existe, o undefined.

También debe tener closeWindow, por lo que no se mantienen las referencias a las ventanas que abrió a sí mismo:

function closeWindow(name) { 
    var window = windows[name]; 
    if(window) { 
     window.close(); 
     delete windows[name]; 
    } 
} 

Si no es posible, lo que es el punto de dar nombres de las ventanas?

El nombre se usa internamente en el navegador para administrar ventanas. Si llama al window.open con el mismo nombre, no abrirá una nueva ventana, sino que cargará la URL en la ventana abierta anteriormente. Hay unas cuantas cosas más, desde MDN window.open():

Si una ventana con el nombre strWindowName ya existe, entonces strURL se carga en la ventana existente. En este caso, el valor de retorno del método es la ventana existente y strWindowFeatures se ignora. Proporcionar una cadena vacía para strUrl es una forma de obtener una referencia a una ventana abierta por su nombre sin cambiar la ubicación de la ventana. Para abrir una nueva ventana en cada llamada de window.open(), use el valor especial _blank para strWindowName.

+0

buena explicación y solución temporal. ¡Gracias! –

+0

Esto puede estar bien para Windows pero no funciona en mi sistema Linux ... no estoy seguro de si es una referencia de Microsoft Windows o no, pero a veces lo que sucede en mi máquina Linux también ocurre en Mac ... – CrandellWS

+0

Comenzando con Google Chrome 41, este método tiene un mal efecto secundario: siempre que ejecute window.open(), la ventana ya abierta tendrá el foco. Actualmente no hay ninguna solución que pueda encontrar para evitar este comportamiento, lo que me está dando dolores de cabeza. Solo quiero hacer referencia a esa ventana, no quiero que se concentre. Llamar a window.open() con la url vacía no funciona. – schlingel

14

Linus G Thiel dice que no se puede hacer esto en javascript. Por extraño que parezca, su respuesta enumera un extracto de MDN que suena como si dijera cómo hacer esto. La línea era:

"Providing an empty string for strUrl is a way to get a reference to 
    an open window by its name without changing the window's location." 

Intenté esto y me funciona.

winref = window.open('', 'thatname', '', true); 
winref.close(); 

Sin embargo, esto solo puede funcionar si abre la ventana de su página. Y si eso es cierto, entonces es inútil hacer una ventana. Abrir solo para obtener la referencia. Probablemente ya tenga la referencia, en ese caso.

+2

En realidad, no se basa en quién lo abrió, sino en el origen o los dominios que comparten las páginas. – aredridel

+0

Puede borrar los contenidos con 'winref.document.close();' y agregar nuevo contenido con 'winref.document.write ('Nuevo contenido');' – CrandellWS

3

solución de Mark Goldfain ya no funciona como está escrito a partir del 9/8/2015

Según this w3 specification,

Si el primer argumento es la cadena vacía, entonces el argumento url debe ser interpretado como "sobre: ​​en blanco".

Creo que esta es una diferencia entre HTML4 y HTML5.

IE y Chrome han actualizado este comportamiento para que coincida con esta especificación, mientras que la solución de Mark todavía funciona en FF (aunque imagino que lo arreglarán pronto). Hace unas semanas, esto funcionó en todos los principales navegadores.

Mi problema particular implicó el control de la ventana durante la navegación, donde la apertura de la ventana del chat está en negro y la mayor parte del código en la página, redefiniendo window.open fue correcto. Mi solución consistía en llamar a la ventana en blanco con la referencia antes de llamando a la función que llamaba a la ventana de chat. Cuando el usuario navegaba fuera de la página, pude confiar en el hecho de que las ventanas que no sean las originales no pueden modificar la ventana secundaria, por lo que pude utilizar la solución de Mark Goldfain sin cambios.

3

La solución proporcionada por Mark Goldfain se puede editar para que funcione con los nuevos navegadores, al menos para abrir una ventana y mantener una referencia entre la actualización de la página.

var winref = window.open('', 'MyWindowName', '', true); 
if(winref.location.href === 'about:blank'){ 
    winref.location.href = 'http://example.com'; 
} 

o en formato función

function openOnce(url, target){ 
    // open a blank "target" window 
    // or get the reference to the existing "target" window 
    var winref = window.open('', target, '', true); 

    // if the "target" window was just opened, change its url 
    if(winref.location.href === 'about:blank'){ 
     winref.location.href = url; 
    } 
    return winref; 
} 
openOnce('http://example.com', 'MyWindowName'); 
0

Terminé usando la siguiente:

var newwindows = {}; 
function popitup(url, nm) { 
    if ((newwindows[nm] == null) || (newwindows[nm].closed)) { 
    newwindows[nm] = window.open(url, nm, 'width=1200,height=650,scrollbars=yes,resizable=yes'); 
    } 
    newwindows[nm].focus(); 
} 

continuación referenciados usando:

 <button type="button" onclick="popitup('url/link.aspx?a=bc',this.value)" value="uniqueName">New</button> 
+0

¿Por qué no simplificar la lógica y poner 'newwindows [nm]. focus(); 'fuera de la lógica if en total? Parece redundante ejecutar la misma acción en dos rutas lógicas diferentes, cuando el resultado es la misma acción en ambos sentidos. – GoldBishop

Cuestiones relacionadas