2009-02-09 21 views
21

Ich habe eine Anwendung, die beim Klicken auf einen Link ein neues Fenster öffnet. Dadurch wird eine Seite mit einem Java-Applet erstellt. Das Problem, das ich habe ist, dass das Klicken auf den gleichen Link die Seite erneut lädt, wodurch die Java-Anwendung zurückgesetzt wird. Gibt es eine Möglichkeit, dies zu verhindern? Zwei Lösungen, die akzeptabel wären, sind:JavaScript window.open nur, wenn das Fenster noch nicht existiert

  1. erlauben mehr Fenster aus den Click-Handler geöffnet werden
  2. nachfolgende Anfragen ignorieren, wenn das Fenster geöffnet ist

Apologies für einen Neuling Javascript zu sein - es ist nicht wirklich meine Hauptsache.

Der Code an die Prozedur angebracht ist

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:

Danke für die Antworten - ich die Vorschläge leicht modifiziert, so dass ich mehr als eine URL über die Funktion geöffnet haben könnte.

EDIT2: Es gibt eine andere Version dieses Codes bei 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; 
    } 
} 

Antwort

19

Ich würde es so machen - basi speichert alle referenzierten geöffneten Fenster in der Funktion selbst. Wenn die Funktion ausgelöst wird, überprüfen Sie, ob das Fenster nicht existiert oder sich in der Nähe befindet - starten Sie das Popup. Konzentrieren Sie sich andernfalls auf das vorhandene Popup-Fenster für diese Anfrage.

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

Yep, das ist, wie ich es tun würde - weniger Platzbedarf, mehr Wiederverwendung, in sich abgeschlossen +1 – annakata

+3

+1 funktioniert gut.Eine Sache jedoch, Sie haben 'winRefs' in der ursprünglichen Prüfung, aber dann Sie es später als' winrefs' falsch schreiben – Rondel

5

Sie so etwas wie dieses in der Seite verwenden können, um das neue Fenster öffnet sich:

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

Oder einfach (winref || || winref.closed winref.document!): If (! newWindow || newWindow.closed) –

+0

Dies fokussiert das Fenster nicht, wenn es bereits geöffnet ist, und lädt auch nie mit der neuen URL – SCC

2

Sie mögen diese überprüfen könnten :

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

mögliche Null-Zeiger-Typ-Probleme in diesem Formular – annakata

+0

@annakata - Ich denke * es gibt kein Null-Zeiger-Problem, denn wenn '! Winref' wahr ist, dann sollte der zweite Teil des IOR -' winref.closed' - nie überprüft werden. Scheint das richtig zu dir? Oder liege ich falsch? –

20

Sie müssen 2 Tests durchführen ... 1 prüfen, ob das Popup-Fenster definiert ist, und 2 prüfen, ob es geschlossen war.

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

Ausgezeichnete Lösung als Querbrowser – SCC

+0

Aber es lädt das Fenster, selbst wenn die URL gleich ist – SCC

+0

@ user2826057 wie die Anmerkung in meinem Kommentar im Code - Wenn Sie den Inhalt nicht erneut laden möchten, wenn es die gleiche URL ist, können Sie 'if (winRef.location.href! = myNewURL) {...}' testen, um nur dann neu zu laden, wenn es anders ist. – scunliffe

0

Versuchen Prüfung:

wenn { }

3

Arbeits Code

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();  
    } 
} 
Verwandte Themen