Avatar billede softspot Forsker
27. januar 2006 - 23:21 Der er 36 kommentarer og
1 løsning

Hvordan finder man et andet vindue?

Jeg skal fra et browservindue gerne have fat i et andet browservindue. Vinduet findes som måske og jeg kender navnet på vinduet.

Jeg vil kun have et handle til det pågældende vindue hvis det eksisterer, ellers vil jeg bare have en handle som indeholder null (eller en anden værdi der signalerer at vinduet ikke findes/er åben).

Løsningen skal gerne være anvendelig i de gængse nyere browsere.

Bare til info, så har jeg forsøgt mig med dette:

    var w = window.open('java script:void()','tmp');

men hvis vinduet ikke findes, får jeg bare et blank vindue, hvilket jeg som sagt ikke er så interesseret i.


Nogen der ved hvordan det skal løses?
Avatar billede olebole Juniormester
28. januar 2006 - 03:25 #1
<ole>

Variablen 'w' skal være erklæret globalt (ikke i en funktion) - og så kan du spørge med:
  if (!w.closed) alert("Da shit's closed")

Hvad laver iøvrigt 'java script:void()'? En tom streng er langt kønnere og giver mening  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
28. januar 2006 - 03:28 #2
Ooooops ... lige omvendt  :D
    if (w.closed) alert("Da shit's closed")

Har vinduet ikke været åbent, smider den linje dog en fejl. Løsning:

var w = {closed:true};
function myOpen() {
    w = window.open("", "tmp");
}

function checkOpen() {
    if (w.closed) alert("Endnu ikke åbnet - eller lukket igen")
}
Avatar billede olebole Juniormester
28. januar 2006 - 03:29 #3
:)
Avatar billede softspot Forsker
28. januar 2006 - 11:16 #4
Den version åbner da stadig et lille vindue inden den finder ud af at det vindue jeg søger ikke er åben...(eller er det mig der har modficeret koden forkert?)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title></title>
  <script type="text/javascript">
    var w = {closed:true};
   
    window.onload = function() {
      try {
        w = window.open('','tmp','width=20,height=20');
      }
      catch(e) {};
     
      if(!w.closed && w.location.href != '' && w.location.href != 'about:blank')
        w.focus();
      else
        w.close();
   
      setInterval("testPopup()", 1000);
    }
   
    function testPopup() {
      try {
        if(!w.closed) {
          document.getElementById("st").innerHTML = "Vinduet er åben";
        }
        else
          document.getElementById("st").innerHTML = "Vinduet er lukket";
      }
      catch(e) {
        document.getElementById("st").innerHTML = "Vinduet er lukket";
      }
    }
  </script>
</head>
<body>
  <div id="st">&nbsp;</div>
  <iframe name="testpopsrc"></iframe>
</body>
</html>
Avatar billede roenving Novice
28. januar 2006 - 12:56 #5
Ja, du kan ikke finde ud af om et vindue er åbent onload uden at du evt. kommer til at åbne et nyt !-)
Avatar billede softspot Forsker
28. januar 2006 - 13:02 #6
OK, så hvis jeg bare smider en timer ind som trigger checket, så burde det fungere...
Avatar billede softspot Forsker
28. januar 2006 - 13:08 #7
Nu har jeg ændret onload til:

    window.onload = function() {
      setTimeout("checkWindow()",50);
    }
   
    function checkWindow() {
      try {
        w = window.open('','tmp','width=20,height=20');
      }
      catch(e) {};
     
      if(!w.closed && w.location.href != '' && w.location.href != 'about:blank')
        w.focus();
      else
        w.close();
   
      setInterval("testPopup()", 1000);
    }

men der kommer stadig et lille vindue op (i et kort øjeblik), hvis vinduet tmp ikke findes...
Avatar billede softspot Forsker
29. januar 2006 - 10:56 #8
Jeg tager tavsheden som et udtryk for at der ikke er noget at gøre ved det, så jeg takker for Jeres deltagelse (og tildeler olebole point :))...
Avatar billede olebole Juniormester
30. januar 2006 - 06:51 #9
Undskyld, at jeg ikke har svaret før, skyldes GMail har smidt alle Eksperten-mails i spam-kassen  :o|

Jeg forstår ikke helt, hvad du vil med scriptet. Du åbner jo selv et lille vindue, så det er der vel ikke noget sært ved(?)  :)
Avatar billede softspot Forsker
30. januar 2006 - 11:37 #10
Det at jeg bruger window.open er bare et udtryk for min uendelige uvidenhed udi DHTML, javascript osv., samt min totale blottelse for evner til at finde nogle passende søgeord til Google

GOOGLE ER MIN VEN!

GOOGLE ER STOR!

JEG BØJER MIG YDMYGT I STØVET FOR GOOGLE!

...eeh... hvor kom jeg fra...?

Nåh jo, det jeg gerne ville opnå var at finde et andet åbent vindue, lidt ligesom man kan i Windows API ved f.eks. at angive titlen af vinduet. Hvis der findes en metode til at skaffe en handle til et andet vindue end window.open, er jeg da riiiiimelig interesseret i at høre hvordan...
Avatar billede olebole Juniormester
30. januar 2006 - 12:15 #11
Du kan jo altid gøre noget à la (men jeg forstår stadig ikke, hvordan det skal bruges):

var oWindows = {};
function myOpen() {
    var w = window.open( ......... );
    return w;
}

oWindows["ko"] = myOpen();
oWindows["kylling"] = myOpen();
oWindows["gnu"] = myOpen();

- og så kan du vælge, hvad du vil lukke, fokusere, eller hvad har du - og hvornår:

oWindows["kylling"].close();
oWindows["gnu"].focus();
oWindows["ko"].close();
Avatar billede olebole Juniormester
30. januar 2006 - 12:16 #12
- og når objektets (oWindows) properties først er sat, kan du også kalde dem med dot-notation, hvis du vil:

oWindows.kylling.close();
oWindows["gnu"].focus();
oWindows.ko.close();
Avatar billede olebole Juniormester
30. januar 2006 - 12:21 #13
- og husk, at navnet på selve vinduerne skal være forskellige, hvis du vil åbne flere popup-vinduer. Går der mere end ét msec mellem åbningerne, kan du gøre sådan:

    window.open("http://www.domain.dk", "w"+new Date().getTime(), "width=400,height=300")
Avatar billede softspot Forsker
30. januar 2006 - 12:21 #14
Mit problem er, at jeg ikke har nogen steder hvor jeg kan holde state, som du foreslår der, for den side som åbner vinduet er ikke nødvendigvis det der skal finde vinduet igen... netop derfor søger jeg en afkoblet metode til at finde et vindue :)
Avatar billede olebole Juniormester
30. januar 2006 - 12:43 #15
Du kan ikke kalde mellem forskellige browsersessions. Hvis du starter med én browser - og åbner resten som popup vinduer derfra - kan du fra alle popups kalde det første browservindue med 'opener', hvis du i alle popups skriver:

<script type="text/JavaScript">
function myOpen() {
    var w = window.open( ........ )
    w.opener = window.opener? window.opener : window;
}
</script>

Så vil det oprindelige browservindue blive 'opener' for popup'en. Åbner denne også en popup, bliver browservinduet også denne popup's 'opener' - osv.

Skal alle vinduer poppes op fra det samme browser-vindue, kan du altid referere til dette med 'window.opener', som i en popup altid refererer til det vindue, der åbnede popup'en.
I det tilfælde behøver du med andre ord ikke lave det ovenstående cowboy-trick  :)
Avatar billede olebole Juniormester
30. januar 2006 - 12:45 #16
- i begge tilfælde kan du altså skrive din 'oWindows'-variabel i den første browser - og fra alle popups referere til denne med 'window.opener.oWindows'
Avatar billede olebole Juniormester
30. januar 2006 - 12:46 #17
- under alle omstændigheder, _må_ og _skal_ dine vinduer 'hænge sammen'. Ellers kender de så at sige ikke hinanden
Avatar billede softspot Forsker
30. januar 2006 - 14:20 #18
30/01-2006 12:43:46 >> Hvad sker der så med alle de opener-referencer, hvis man i hovedvinduet navigerer til en anden side (indefor samme domæne)?

30/01-2006 12:46:34 >> Det er efterhånden også den konklusion jeg er nået frem til...
Avatar billede olebole Juniormester
30. januar 2006 - 14:22 #19
'opener' referer til vindues-objektet ... ikke til dokumentet. Den ligger med andre ord fast  :)
Avatar billede softspot Forsker
30. januar 2006 - 14:25 #20
OK, men min vinduestilstandsliste (oWindows) vil stadig dø, da den vel ligger i et document i det pågældende window-objekt... eller hvad?
Avatar billede olebole Juniormester
30. januar 2006 - 14:38 #21
Ja, med mindre du laver dokumentet med en 100%x100% iframe. Så kan du navigere i iframe'en - men beholde variabler i hoveddokumentet
Avatar billede softspot Forsker
30. januar 2006 - 14:43 #22
Ja, den løsning har jeg også lige vendt med en af mine venner :)

Selvom det nok er en bedre løsning i mit tilfælde, er det (af tidsmæssige årsager) bare ikke en mulighed jeg kan benytte lige i øjeblikket - desværre... :(

Jeg går ud fra at window-objektet ikke giver mulighed for expando-properties...?
Avatar billede olebole Juniormester
30. januar 2006 - 14:46 #23
Enhver variabel ligger automatisk som property på window-objektet ... der kan du bare lægge alle de variabler/properties, du vil.

Jeg kender ikke projektet i enkeltheder, så det er svært at komme med den helt smarte løsning  :o|
Avatar billede softspot Forsker
30. januar 2006 - 15:09 #24
OK, men de expando-properties vil også dø hvis jeg navigerer væk fra den aktuelle side, eller hvad?

Grundliggende vil jeg gerne, på et givent tidspunkt, kunne kontrollere om en tilstand er opstået eller består. En tilstand kunne f.eks. være et (popup)vindue der publiserer information eller noget andet som skal kunne overleve uafbrudt, at der navigeres i hovedvinduet.

Jeg forstår sagtens teknikken i det du siger (selv i uendelig uvidenhed er der vel plads til lidt viden :)), men der er bare nogle ting jeg gerne vil have afklaret ifht. evt. muligheder i DOM. Muligheder som jeg ikke selv har været i stand til at finde i DOM eller de forskellige browsertypers implementeringer (for det skal jo naturligvis fungere på tværs af de nyeste browserversioner og -typer). Jeg ved at Windows API har en mulighed for at finde et vindue og tænkte derfor, at det måske var noget browserne havde adopteret... men det lader ikke til at være tilfældet.
Avatar billede olebole Juniormester
30. januar 2006 - 15:38 #25
Ja, de expandoes dør, når der navigeres.

Here comes a tricky one  :)
Du kan åbne et 'global-cache' vindue, som gøres til 'opener' for alle andre vinduer, der poppes op - uanset om der navigeres væk i hoved-browseren:

hoved-dokument:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
</head>
<body>

<script type="text/JavaScript">
var globalCache = null;
function myOpen() {
    if (!globalCache) globalCache = window.open("global.html", "x"+new Date().getTime(), "width=400,height=300");
    var w = window.open("bar.html", "x"+new Date().getTime(), "width=400,height=300");
    opener = w.opener = globalCache;
}
</script>

<button onclick="myOpen()">Åben</button><br>
<button onclick="opener.enVar='min første var'">Set Var</button>
<br><br>
<a href="http://www.google.dk">Google</a>

</body>
</html>

- og det 'tomme, globale' dokument:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
<style type="text/css">
html, body {
    background-color: yellow;
}
</style>
</head>
<body>

<h1>Global Cache</h1>

</body>
</html>

- og et enkelt popup, du kan blive ved med at poppe op:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
</head>
<body>

<script type="text/JavaScript">
function myOpen() {
    var w = window.open("bar.html", "x"+new Date().getTime(), "width=400,height=300");
    w.opener = opener;
}
</script>

<button onclick="myOpen()">Åben</button><br>
<button onclick="opener.enAndenVar='min anden var'">Set Var</button>
<br><br>
<button onclick="alert(opener.enVar)">Test Var 1</button>
<button onclick="alert(opener.enAndenVar)">Test Var 2</button>


</body>
</html>

- prøv at lege lidt med dem. Jeg håber, du kan se meningen med dem  :)
Avatar billede olebole Juniormester
30. januar 2006 - 15:41 #26
De hedder:

hoved: 'foo.html'
global: 'global.html'
popup: 'bar.html'

- så passer det med URL'erne  :)
Avatar billede olebole Juniormester
30. januar 2006 - 15:44 #27
Alle vinduernes opener-property peger mod det tomme, gule dokument - hvorfor alle variabler, der bliver sat på vinduernes opener, bliver sat i dette dokument. Håber, det er til at forstå(?)  :)
Avatar billede softspot Forsker
30. januar 2006 - 15:57 #28
Jo, det er til at forstå og vel nogenlunde det samme princip som skulle bruges ifm. en framed løsning, hvor man havede den globale cache liggende i en skjult frame i et frameset og så navigerede i den synlige 100%-frame...

Det jeg ikke så vild med (ja, jeg ved godt at jeg er mega besværlig og utaknemlig - undskyld!), det er at jeg skal have et vindue liggende som kan agere cache og så i øvrigt ikke har anden funktion. Det vil brugeren (og min projektleder) nok have lidt svært ved at forstå... :)

Umiddelbart kan jeg fornemme, at jeg er ude i noget med symptombehandling af et arkitektonisk problem i min applikation. Det må jeg jo bare tage til efterretning til senere revisioner og klare mig med lidt mindre end jeg gerne vil have...

Jeg er naturligvis interesseret i andre opfindsomme forslag der enten kan fungere som en løsning for sig selv eller bare kan fungere som inspiration til hvordan man kan opnå den ønskede effekt, som diskuteret ovenfor. :)

Under alle omstændigheder takker for for den interesse du har udvist for mit sære behov indtil videre.
Avatar billede olebole Juniormester
30. januar 2006 - 16:14 #29
Det er zq da de sære behov, der er de sjove - hvis de altså ikke omfatter ting som at kaste døde dyrebørns afføring på sig selv eller andre  ;D
Avatar billede softspot Forsker
30. januar 2006 - 16:16 #30
*LOL* - kan jeg fornemme en Monrad & Rislund fan der... ;-)
Avatar billede olebole Juniormester
30. januar 2006 - 16:23 #31
Hehe ... jeg har såmænd spillet med Jan i gamle dage - i det hedengangne syre-skiffle-band 'Supermas Baller' (nej, ikke 'supermands'). En af forløberne for det oprindelige 'Total Petroleum'. De bands havde flere gode navne ... f.eks. 'Albani Hårspray' og 'Kemisk Kor og Orkester' - den slags var Mik Schack (også) god til at finde på  ;o)

Jeg ved ikke, hvorfor - men jeg havde fået opfattelsen af, det var noget, du skulle bruge lokalt. Jeg kan sagtens se, det ikke holder på WWW  =)
Avatar billede softspot Forsker
30. januar 2006 - 16:34 #32
Det er da løwn!? Hanging out with the heavy guys! Det forklarer jo unægetlig den humor som gør dig så... "populær" herinde på eksperten :D
Avatar billede olebole Juniormester
30. januar 2006 - 16:44 #33
Såså ... nu skal de jo heller ikke have skylden for alt  *LoL*
Avatar billede softspot Forsker
30. januar 2006 - 16:55 #34
Nej OK. Nu ved jeg jo ikke hvorlænge du spillede sammen med Jan, men man skal vel selv have den form for humor, hvis man skal kunne holde det ud i længere tid(?) :)
Avatar billede olebole Juniormester
30. januar 2006 - 17:06 #35
Vi var en flok, der tumlede rundt to/fire år omkring 1970 - men derefter var jeg lyd/lys tekniker (primært lyd) i 20 år. I scenetekniker-kredse føres en rå, men kærlig omgangstone, så deeeeeeet .......  ;D
Avatar billede softspot Forsker
30. januar 2006 - 17:13 #36
Ja, det var nogenlunde den samme opfattelse jeg fik af at være systemudvikler, da jeg blev ansat i mit første job (hvor der i øvrigt også sad en hardcore M&R-fan som seniorudvikler ;D). Men det er sjovt at være sådan et sted - når først man finder ud af hvad der skal lægges i de forskellige bemærkninger... :)
Avatar billede olebole Juniormester
30. januar 2006 - 17:18 #37
Præcis - og så er det altid lettere at forstå ånden i dialogen, når man fysisk er tilstede i samme rum ... eller har 'kulturen' inde under huden  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester