javascript - Hvordan kan jeg kontrollere for en åben URL i et andet vindue?

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er en opfølgning på mit sidste spørgsmål Åbn et vindue, hvis vinduet ikke allerede eksisterer
I det væsentlige holder jeg nu en liste over alle vinduesreferencer, der er åbnet af en side, og kun giver dem mulighed for at blive åbnet, hvis de ikke allerede er åbne. Derefter ramte et potentielt problem mig - det er selvfølgelig muligt for en bruger at lukke det oprindelige vindue og åbne det igen, og dermed tabe listen med vinduesreferencer.


Er det muligt at løbe gennem vinduerne åbne i en browser og kontrollere en bestemt webadresse?


Redigere:
Efter mange nyttige kommentarer her (og på det andet spørgsmål), her er den endelige kode for ansøgnings launcher. I det væsentlige forsøger den at få placeringen af ​​det åbne vindue med det relevante navn. Hvis det medfører en undtagelse (på grund af et privatlivsproblem), vurderes ansøgningen at være blevet indlæst. Hvis det er 'omkring: blank', så er det et nyt vindue. Dette virker på Firefox, IE7 og Google Chrome. Det føles beskidt ...


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;
    }
}

Bedste reference



  @annakata (og selvom du har gemt dem, ville du ikke have tilladelse til at lukke dem mere)



Ikke sandt. Hvis du har navnet på vinduet, kan du bruge window.open til at genoprette et link til vinduet, selvom åbningen blev lukket og genåbnet. For eksempel:


<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>

Andre referencer 1


Nej, det ville være et sikkerhedsproblem.





Siden andre har opbygget ejendoms-/cookie-tilstandsopbevaring: Dette virker kun, hvis du også er det samme dokument, som åbnede vinduet, dvs. i scenariet hvor brugeren lukker vinduet ned og genåbner, så er disse referencer faktisk tabt (og selvom du lagrede dem, du ville ikke have tilladelse til at lukke dem mere)

Andre referencer 2


I JavaScript kan du kun få referencer til det aktuelle vindue og eventuelle vinduer, du åbner med window.open.


Du kan tjekke for winRef.closed for at se om brugeren lukkede vinduet. Jeg er ikke sikker på, om det fungerer godt på alle browsere eller ej.

Andre referencer 3


Hvis du gav hvert vindue et unikt vindue navn (det andet argument i window.open), ringer vinduet.åbne igen med samme vindue navn vil enten åbne vinduet, hvis det er lukket eller returnere en henvisning til det eksisterende vindue uden åbning et nyt vindue.

Andre referencer 4


Du kan faktisk gøre det med cookies , men ... hvis du spørger mig, vil du ikke gøre det.

Andre referencer 5


Opsæt et array, og øg det med vinduesreferencer, når du åbner dem ...


var wins = new Array();

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


Så når du ønsker at kontrollere status for vinduerne, kan du løkke igennem dem som dette og fjerne de vinduer, der ikke åbnes ...


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);
}


Med venlig hilsen...