2014-07-07 9 views
5

Angenommen, Sie eine Handvoll Fenster mit öffnen:Javascript: Wie eine Liste aller geöffneten Fenster bekommen

window.open(url1,'win1'); 
    window.open(url2,'win2'); 
    window.open(url3,'win3'); 

(jedes Fenster hat einen eindeutigen Namen)

und aktualisieren Sie die Seite.

Die 3 Popup-Fenster sind noch offen. Gibt es eine Möglichkeit, die Namen aller geöffneten Fenster aufzulisten und zu schließen?

Dies ist keine doppelte Frage.

In dieser Frage wird der Browser aktualisiert, so dass Sie nicht einfach ein globales Array verwenden können, um untergeordnete Fenster zu verfolgen.

Dies ist keine doppelte Frage.

+0

Nein ist es nicht, es sei denn, die URLs aus der gleichen Domäne sind. Dann könnte es eine Möglichkeit geben, zwischen diesen Fenstern zu kommunizieren, aber ich denke nicht, dass Sie sie programmatisch schließen können, da Sie den Verweis auf die Fenster verloren haben. –

+0

Die URLs befinden sich in derselben Domäne. –

+1

Dann könnten sie an localStorage schreiben, wie es [hier] vorgeschlagen wurde (http://stackoverflow.com/q/2236828/218196). Vielleicht haben die Kinderfenster Änderungen zu hören und sie sich selbst zu schließen. –

Antwort

4

So ist die Fragen geschlossen, ich werde eine Antwort basierend auf den Kommentaren und Forschung veröffentlichen.

Erstens, an alle, die kommentiert, danke für Ihre Hilfe.

Antwort: Es gibt kein integriertes Objekt, das geöffnete Fenster verfolgt und vom Laden der Seite bis zum Laden der Seite anhält.

Wie Felix Kling darauf hingewiesen hat, ist die Verwendung von localStorage ein möglicher Workaround.

1

Testen Sie PostMessage, um zwischen vorhandenen Fenstern innerhalb derselben Domäne zu kommunizieren. So werde ich versuchen, das gleiche Problem zu lösen. Siehe: https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

index.htm

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>pop</title> 
    </head> 
    <body> 

    <script> 

var pops = []; 

window.onmessage = function(e) 
{ 

    // todo: check domain 
    // if(e.origin) 
    var data; 
    try 
    { 
     data = JSON.parse(e.data); 
    } 
    catch(e) 
    { 
     // fail silent...? 
     return; 
    } 
    switch(data.event) 
    { 
    case "RestoreOpenWindow": 
     onClosePopup(e.source.name); 
    case "QueryOpenWindows": 
     pops.push(e.source); 
     updateLabel(); 
     break; 
    } 
}; 

window.onload = function() 
{ 
    window.onClosePopup = onClosePopup; 
    updateLabel(); 
}; 

window.onbeforeunload = function() 
{ 
    for(var i = 0; i < pops.length; i++) pops[i].queryOpenPopups(); 
}; 

function onClosePopup(name) 
{ 
    for(var i = pops.length - 1; i >= 0; i--) 
     if(pops[i].name === name) 
      { pops.splice(i, 1); break; } 
    updateLabel(); 
}; 

function openPopup() 
{ 
    pops.push(window.open("pop/popup.htm", "pop" + pops.length, ' ')); 
    updateLabel(); 
    setTimeout(function(){ 
     alert('Click ok to refresh...'); 
     location.href = location.href; 
    }, 5000); 
} 

function updateLabel() 
{ 
    document.getElementById("total").innerHTML = pops.length; 
    var html = []; 
    for(var i = 0; i < pops.length; i++) 
     html.push(pops[i].name); 
    document.getElementById("names").innerHTML = html.join("<br"+"/"+">"); 
} 


    </script> 
    <button onclick="openPopup()">open popup and refresh after 5 seconds (...allow em popups...)</button></br> 
    <span>total: </span><span id="total"></span></br> 
    <span id="names"></span></br> 
    </body> 
</html> 

popup.htm

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>pop</title> 
    </head> 
    <body> 

    <script> 

window.queryOpenPopups = function() 
{ 
    var count = 0; 
    var hInterval = setInterval(function() { 
     try 
     { 
      if(window.opener) 
      { 
       window.opener.postMessage(JSON.stringify({"event": "QueryOpenWindows", "name": window.name}), "*"); 
       clearInterval(hInterval); 
      } else count++; 
     } 
     catch(e) 
     { 
      count++; 
     }  
     if(count > 50)window.close(); 
    }, 100); 
}; 

window.onbeforeunload = function(){ 
    window.opener.onClosePopup(window.name); 
}; 

// restore link with opener on refresh 
window.opener.postMessage(JSON.stringify({"event": "RestoreOpenWindow", "name": window.name}), "*"); 

window.onload=function(){ document.getElementById("name").innerHTML = window.name; }; 
    </script>  
    <span id="name"></span> 
    </body> 
</html> 
Verwandte Themen