2009-02-09 14 views
21

Tengo una aplicación que abre una nueva ventana al hacer clic en un enlace. Esto genera una página que contiene un applet de Java. El problema que estoy teniendo es que al hacer clic en el mismo enlace se vuelve a cargar la página, lo que restablece la aplicación Java. ¿Hay alguna forma de atrapar esto? Dos soluciones que sean aceptables son:JavaScript window.open only si la ventana ya no existe

  1. permitir que múltiples ventanas para abrirse desde el controlador de clic
  2. ignorar las solicitudes posteriores, si la ventana ya está abierta

Disculpas por ser un novato Javascript - es realmente no es lo principal.

El código adjunto al controlador es

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

    var l_params = 'status=1' + 
       ',resizable=1' + 
       ',scrollbars=1' + 
       ',width=' + l_width + 
       ',height=' + l_height + 
       ',left=0' + 
       ',top=0'; 

    winRef = window.open(l_url, l_windowName, l_params); 
    winRef.moveTo(0,0); 
    winRef.resizeTo(l_width, l_height); 
} 

EDIT:

Gracias por las respuestas - I modificado ligeramente las sugerencias para que yo pudiera tener más de una dirección URL abierta a través de la función.

Edit2: Hay otra versión de este código en Check for a URL open on another window

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]; 
    } 
    alert(winRef); 
    if (winRef == null || winRef.closed) { 
     winRef = window.open(l_url, l_windowName, l_params); 
     winRef.moveTo(0,0); 
     winRef.resizeTo(l_width, l_height); 
     g_urlarray[l_url] = winRef; 
    } 
} 

Respuesta

19

Lo haré así - basi almacenan todas las ventanas abiertas referenciadas en la función en sí. Cuando la función se activa, verifique si la ventana no existe o ha estado cerca, de modo que inicie la ventana emergente. De lo contrario, concéntrese en la ventana emergente existente para esa solicitud.

function launchApplication(l_url, l_windowName) 
{ 
    if (typeof launchApplication.winRefs == 'undefined') 
    { 
    launchApplication.winRefs = {}; 
    } 
    if (typeof launchApplication.winRefs[l_windowName] == 'undefined' || launchApplication.winRefs[l_windowName].closed) 
    { 
    var l_width = screen.availWidth; 
    var l_height = screen.availHeight; 

    var l_params = 'status=1' + 
        ',resizable=1' + 
        ',scrollbars=1' + 
        ',width=' + l_width + 
        ',height=' + l_height + 
        ',left=0' + 
        ',top=0'; 

    launchApplication.winRefs[l_windowName] = window.open(l_url, l_windowName, l_params); 
    launchApplication.winRefs[l_windowName].moveTo(0,0); 
    launchApplication.winRefs[l_windowName].resizeTo(l_width, l_height); 
    } else { 
    launchApplication.winRefs[l_windowName].focus() 
    } 
} 
+0

sí, así es como lo haría: huella más baja, más reutilización, autónomo +1 – annakata

+3

+1 funciona muy bien.Sin embargo, una cosa es que tienes 'winRefs' en el cheque original pero luego lo deletreas más tarde como' winrefs' – Rondel

5

Usted puede usar algo como esto en la página que se abre la nueva ventana:

var newWindow = null; 

function launchApplication() 
{ 
    // open the new window only if newWindow is null (not opened yet) 
    // or if it was closed 
    if ((newWindow == null) || (newWindow.closed)) 
    newWindow = window.open(...); 
} 
+1

O simplemente (winref || || winref.closed winref.document!): If (! newWindow || newWindow.closed) –

+0

esto no enfoca la ventana si ya se ha abierto y tampoco se carga con la nueva URL – SCC

2

se puede comprobar como esta :

if(!winref || winref.closed) 
{ 
} 
+0

posibles problemas con el tipo de puntero nulo en esa forma – annakata

+0

@annakata - Creo * que no hay un problema de puntero nulo, porque si '! Winref' es verdadero, entonces la segunda parte del IOR -' winref.closed' - nunca debería ser revisada. ¿Esto te parece correcto? ¿O estoy completamente equivocado? –

20

Debe realizar 2 pruebas ... 1 compruebe si la ventana emergente está definida, y 2 compruebe si se cerró.

if(typeof(winRef) == 'undefined' || winRef.closed){ 
    //create new 
    winRef = window.open(....); 
} else { 
    //it exists, load new content (if necs.) 
    winRef.location.href = 'your new url'; 
    //give it focus (in case it got burried) 
    winRef.focus(); 
} 
+0

Excelente solución como navegador cruzado – SCC

+0

Pero vuelve a cargar la ventana incluso si el URL es el mismo – SCC

+0

@ user2826057 según la nota en mi comente en el código: si no desea volver a cargar el contenido si es la misma URL, puede probar 'if (winRef.location.href! = myNewURL) {...}' para volver a cargar solo si es diferente. – scunliffe

0

comprobación Probar:

si {}

3

código de trabajo

var newwindow = null; 
function popitup(url) { 
    if ((newwindow == null) || (newwindow.closed)) { 
     newwindow=window.open(url,'Buy','width=950,height=650,scrollbars=yes,resizable=yes'); 
     newwindow.focus(); 
    } else { 
     newwindow.location.href = url; 
     newwindow.focus();  
    } 
} 
Cuestiones relacionadas