27. januar 2006 - 23:21Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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};
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...
- 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:
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 :)
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 :)
- 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'
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...?
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.
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 :)
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å(?) :)
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.
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 =)
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(?) :)
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
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... :)
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)
Synes godt om
Ny brugerNybegynder
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.