[Javascript] Handle van geopende popup verkrijgen

Pagina: 1
Acties:

Onderwerpen


  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Voor een website ben ik bezig een Flash player te implementeren. Deze flashplayer kan een dynamische playlist hebben die ik graag via verschillende pagina's van die website wil vullen (middels javascript). Deze pagina's zullen opnieuw laden wanneer erop gesurfed wordt. Mijn probleem is dat ik dan de handle van de geopende pop up kwijt ben. Is er een mogelijkheid een popup in de lucht te brengen die ik na het opnieuw laden van de parent window weer kan benaderen?

Nu heb ik dit

Parent:
JavaScript:
1
2
3
4
var player = null;
player = window.open ("child.html","player"); 

player.testAlert("success");


Child:
JavaScript:
1
2
3
function testAlert(input) {
    alert(input);
}

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Je kan vanuit de child toch (periodiek) controleren of de parent gerefreshed is d.m.v. het controleren van (de waarde van) een variabele in de parent? Op die manier kan de child zich weer registreren bij de parent indien de handle verdwenen is.

Het is wellicht het makkelijkste om het unload event af te vangen in de parent en op dat moment zet je een procedure in werking in de popup (child). Die procedure controleert of de parent alweer geladen is en registreert zichzelf dan weer als child.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • koekiemonster
  • Registratie: Maart 2001
  • Laatst online: 13-08 19:58

koekiemonster

want a cookie

Wat Boriz zegt, je kunt de opener. gebruiken om de parent te controleren. Andersom kan ook, kijk even hiernaar:
http://radio.javaranch.co.../01/18/1106063002000.html

[webhero.nl]


Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Thanks voor de feedback, dit waren mijn gedachten ook. Toch had ik liever gehad dat je kan kijken welke vensters open zijn, hierdoor kan een gebruiker zijn vensters sluiten (op de flashplayer na) en later via de website (in een nieuwe parent) de playlist weer vullen.

Desalniettemin is het onderstaande het resultaat, hierbij moet de parent wel open blijven. Het is wel mogelijk een andere website te bezoeken met de initiele parent om vervolgens weer terug te keren.

Parent:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<html>
<head>
    <title>Parent</title>
    <script type="text/javascript">
    var winPop;
    var hasHandle = false;
    function OpenWindow(){
        winPop = window.open("child.html","winPop");
        hasHandle = true;
    }
    
    function handleUnload () {
        alert('handling unload');
        winPop.passData(winPop)
    }

    function receiveData(popup) {
        alert('receiving data');
        winPop = popup;
        hasHandle = true;
    }
    </script>
</head>
<body onunload="handleUnload()">

<a href="javascript:;" onclick="OpenWindow()">Open</a><br />
<a href="javascript:;" onclick="winPop.checkHandle()">Check handle</a><br />


</body>
</html>


Child:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<html>
<head>
    <title>Child</title>
    <script type="text/javascript">
    var thisWindow;

    function checkHandle() {
        alert('handle checked');
    }

    function passData(popup){
        thisWindow = popup;
        setTimeout("SendToParent()", 2000);
    }
    
    function SendToParent() {
        if (window.opener != null && !window.opener.closed) {
            try { //nodig ivm cross domein errors
                window.opener.receiveData(thisWindow);
                if (window.opener.hasHandle) {
                    alert ('handle transferred');
                }
                else {
                    setTimeout ("SendToParent()", 2000);
                }
            }
            catch(err) {
                setTimeout ("SendToParent()", 2000);
            }
        }
        else {
            alert('parent has left the building');
        }
    }
    </script>
</head>
<body>

</body>
</html>

[ Voor 5% gewijzigd door EnsconcE op 20-02-2010 00:21 ]


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Die passData methode in je child is niet nodig hoor de globale variable "window" verwijst al naar je eigen window instance.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • pieturp
  • Registratie: April 2004
  • Laatst online: 27-08 14:18

pieturp

gaffa!

Liever geen strings in setTimeout's gooien. Beter (lees: netter, lichter, snelller) gewoon een referentie naar je functie:
JavaScript:
1
setTimeout(SendToParent, 2000); 


Overigens, kun je ook beter je functienamen met een kleine letter laten beginnen. Ik geloof dat dat in Flash ook gebruikelijk is. Hoofdletters gebruikt men doorgaans voor klasses.

... en etcetera en zo

Pagina: 1