2009-02-09 6 views
5

Esto es una continuación de mi última pregunta Open a window if the window does not already exist Básicamente, ahora estoy manteniendo una lista de todas las referencias de ventanas que han sido abiertas por una página, y solo permitiéndolas abrirlas si aún no están abiertas. Entonces me llamó la atención un problema potencial: por supuesto, es posible que un usuario cierre la ventana original y la abra de nuevo, perdiendo así la lista de referencias a ventanas.¿Cómo puedo verificar si hay una URL abierta en otra ventana?

¿Es posible recorrer las ventanas abiertas en un navegador, buscando una URL en particular?

Editar: Después de un montón de comentarios útiles aquí (y en la otra pregunta), aquí está el código final para el iniciador de aplicaciones. Básicamente, trata de obtener la ubicación de la ventana abierta con el nombre apropiado. Si eso causa una excepción (debido a un problema de privacidad), entonces se considera que la aplicación se ha cargado. Si es "about: blank", entonces es una nueva ventana. Esto funciona en Firefox, IE7 y Google Chrome. Se siente sucio ...

var g_urlarray = []; 

Array.prototype.has = function(value) { 
    var i; 
    for (var i in this) { 
     if (i === value) { 
      return true; 
     } 
    } 
    return false; 
}; 


function launchApplication(l_url, l_windowName) 
{ 
    var l_width = screen.availWidth; 
    var l_height = screen.availHeight; 
    var winRef; 

    var l_params = 'status=1' + 
     ',resizable=1' + 
     ',scrollbars=1' + 
     ',width=' + l_width + 
     ',height=' + l_height + 
     ',left=0' + 
     ',top=0'; 
    if (g_urlarray.has(l_url)) { 
     winRef = g_urlarray[l_url]; 
    } 
    if (winRef == null || winRef.closed) { 
     winRef = window.open('', l_windowName, l_params); 
     var l_openNew = 0; 
     try { 
      if (winRef.location == 'about:blank') { 
       l_openNew = 1; 
      } 
     } 
     catch (e) { 
      l_openNew = 0; 
     } 
     if (l_openNew === 1) 
     { 
      winRef.location = l_url; 
      winRef.moveTo(0,0); 
      winRef.resizeTo(l_width, l_height); 
     } 
     g_urlarray[l_url] = winRef; 
    } 
} 

Respuesta

0

@annakata (e incluso si ellos almacenados, no tendría permiso para cerrarlos más)

No es cierto. Si tiene el nombre de la ventana, puede usar window.open para restablecer un enlace a la ventana, incluso si el abridor se cerró y se volvió a abrir.Por ejemplo:

<script> 
function winOpen(url){ 
    return window.open(url,getWinName(url)); 
} 
function winClose(url){ 
    var win = window.open("",getWinName(url)); 
    win.close(); 
} 
function getWinName(url){ 
    return "win" + url.replace(/[^A-Za-z0-9\-\_]*/g,""); 
} 
</script> 
<a href="#" onclick="winOpen('http://google.com');return false;">Click me first</a>, close and open this window, then 
<a href="#" onclick="winClose('http://google.com');return false;">click me to close the other window</a> 
+0

Esto no funciona para mí en FF, Chrome, Opera o IE, ¿soy yo? – annakata

+0

No podría decírtelo. Me funcionó en IE. – adam0101

4

No, esto sería un problema de seguridad/privacidad.


Dado que otros han mencionado el almacenamiento de estado propiedad/cookie: esto sólo funciona si usted es también el mismo documento que se abrió la ventana, es decir, en el escenario en el que el usuario cierra la ventana hacia abajo y vuelve a abrir a continuación, estas referencias de hecho están perdidos (e incluso si los almacenó, no tendría permiso para cerrarlos más)

+0

Su comentario realidad me puso en el camino de la solución - si tratara de obtener la ubicación de la ventana se produce una excepción, entonces debe haber sido cargado (porque about: blank no una excepción) Muchas gracias. –

+0

Esa es una manera muy buena de trabajar más allá de ella – annakata

2

En JavaScript, solo puede obtener referencias a la ventana actual y cualquier ventana que abra con window.open.

Puede consultar winRef.closed para ver si el usuario cerró la ventana. Sin embargo, no estoy seguro si esto funciona bien en todos los navegadores o no.

2

Si le dio a cada ventana un nombre de ventana único (el segundo argumento de window.open), al llamar a window.open nuevamente con el mismo nombre abrirá la ventana si está cerrada, o devolverá una referencia a la ventana existente sin abrir una nueva ventana.

0

En realidad podría hacerlo con cookies pero ... si me preguntas, no lo harás.

0

instalación de una matriz, y se incrementará con referencias ventana cuando los abra ...

var wins = new Array(); 

function openWindow(url) { 
    wins.push(window.open(url)); 
} 

Luego, cuando se desea comprobar el estado de las ventanas, puede recorrer a través de ellos como este, y eliminar las ventanas que no se abren ...

function updateWindowArray() { 
    for(var i = 0, l = wins.length; i < l; i++) { 
    if(wins[i] == null || wins[i].closed) 
     arrayRemove(wins, i, i + 1); 
    } 
} 

function arrayRemove(array, from, to) { 
    var rest = array.slice((to || from) + 1 || array.length); 
    array.length = from < 0 ? array.length + from : from; 
    return array.push.apply(array, rest); 
} 

Saludos cordiales ...

Cuestiones relacionadas