Toon posts:

Communiceren met popup

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer met een popup te communiceren nadat ik deze geopend heb. Met communiceren bedoel ik informatie die ik in de context van een venster heb, in de context van de popup te krijgen (maar één richting dus). Daarna wil ik het oude venster sluiten. Dit deed ik aanvankelijk op de volgende manier:

JavaScript:
1
2
3
newwin = window.open(url);
newwin.data = node;
window.close();


Door bij de popup onLoad window.data te bekijken, dacht ik dan de data te hebben. Dat lukte ook wel, in Firefox. Internet Explorer kwam echter met een vreemde foutmelding: "De server (niet de servertoepassing) is niet beschikbaar en is verdwenen. Alle verbindingen zijn ongeldig. De aanroep is niet uitgevoerd." (Engels: "The callee (server [not server application]) is not available and disappeared; all connections are invalid. The call did not execute.")

Na uren Googlen en onderzoeken ben ik nog niet erg veel verder gekomen. Ik snap de oorzaak ongeveer, maar weet niet hoe ik het op kan lossen. Met deze testpagina kun je het probleem reproduceren:

HTML:
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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
        <head>
                <title>Popuptest</title>
                <script type="text/javascript">
                        function getData() {
                                var node = window.testnode.cloneNode(true);
                                window.opener.close();
                                debugger;
                        }
                        function putData() {
                                var node = parsexml('<a></a>');

                                var newwin = window.open(location.href);
                                newwin.testnode = node.cloneNode(true);
                                newwin.opener = window;
                                newwin.nonobject = 5;
                        }

                        function parsexml (xml) {
                                var doc = null;

                                if (typeof ActiveXObject != 'undefined') {
                                        doc = new ActiveXObject('Microsoft.XMLDOM');
                                        doc.async = false;
                                        doc.loadXML(xml);
                                } else {
                                        var parser = new DOMParser();
                                        doc = parser.parseFromString(xml, 'text/xml');
                                }

                                return doc.documentElement;
                        }
                </script>
        </head>
        <body onload="getData();">
                <button onClick="putData();">Test!</button>
        </body>
</html>


In Internet Explorer werkt deze code erg willekeurig. Soms bestaat op regel 7 de variabele window.testnode wel, maar vaak niet. Na regel 8 bestaat deze variabele nooit meer. window.nonobject blijft wel bestaan.

Het lijkt dus te maken te hebben met objecten, die worden namelijk niet gekopieerd bij assignments, maar gederefereerd. Zoals je kunt zien heb ik dit al geprobeerd op te lossen met de cloneNodes()-calls. Eén keer in de context van de opener (regel 15), en één keer in de context van de popup (regel 7). Ik heb ook gezorgd dat de opener pas na het klonen gesloten wordt.

Ik kom dus nog steeds niet van het probleem af. Zijn er betere manieren om dit te doen?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 05-11 19:33
Misschien snap ik je probleem niet goed, maar bedoel je niet gewoon dit:

page.html
HTML:
1
2
3
4
5
6
<script>

var data = 123;
window.open('popup.html');

</script>


popup.html
HTML:
1
2
3
4
5
<script>

alert(opener.data);

</script>


Werkt hier gewoon in Firefox en IE6.

Edit:

Het lukt mij echter op geen manier om de opener te sluiten bij het uitvoeren van dit event.

[ Voor 18% gewijzigd door Michali op 19-12-2006 16:00 ]

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Michali schreef op dinsdag 19 december 2006 @ 15:54:
Misschien snap ik je probleem niet goed, maar bedoel je niet gewoon dit:
Het probleem is dat het op beide manieren niet werkt met objecten. Alhoewel, die window.opener wordt wel goed doorgegeven. Met een XML-node werkt het in ieder geval niet.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 05-11 19:33
Dit werkt hier wel:
HTML:
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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
        <head>
                <title>Popuptest</title>
                <script type="text/javascript">
                        function getData() {
                                if ( opener )
                                {
                                    var node = opener.testnode;
                                    opener.close();
                                }
                        }
                        function putData() {
                                var node = parsexml('<a></a>');

                                window.testnode = node.cloneNode(true);
                                var newwin = window.open(location.href);
                        }

                        function parsexml (xml) {
                                var doc = null;

                                if (typeof ActiveXObject != 'undefined') {
                                        doc = new ActiveXObject('Microsoft.XMLDOM');
                                        doc.async = false;
                                        doc.loadXML(xml);
                                } else {
                                        var parser = new DOMParser();
                                        doc = parser.parseFromString(xml, 'text/xml');
                                }

                                return doc.documentElement;
                        }
                </script>
        </head>
        <body onload="getData();">
                <button onClick="putData();">Test!</button>
        </body>
</html>

Ik kreeg wel errors, omdat getData in de root pagina geen resultaat opleverde. Dat is denk ik ook wat jouw probleem is, maar dat weet ik niet zeker.

[ Voor 3% gewijzigd door Michali op 19-12-2006 16:35 ]

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Ik krijg nog steeds ongeveer de helft van de tijd een error: "'node.nodeName' is leeg of geen object". Dat getData() de eerste keer fouten opleverde was de bedoeling (min of meer), omdat ik op die manier maar één pagina nodig had, en gewoon kon doorklikken op die testknop.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 05-11 19:33
Komt dat niet omdat je de data pas koppelt nadat je de window.open doet? Misschien dat de pagina al geladen is voordat je de waarde toekent, maar ik weet niet de ins en outs van executie volgorde dus dat weet ik niet met zekerheid te zeggen.

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Dat heb ik gisteren wel getest, maar niet vaak genoeg. Mozilla doet dat schijnbaar synchroon, in ieder geval wordt consistent de newwin.body.onload pas aangeroepen nadat de data overgeheveld is. Bij Internet Explorer gebeurt het duidelijk asynchroon.

Ik heb het nu met een busy wait opgelost, maar ik zou dat liever anders doen. Een event-handler is geen optie omdat ik die vanuit het oude venster aan zou moeten roepen, en dan werkt hij dus in de context van het oude venster. Als er nog iemand suggesties heeft, hoor ik het dus graag.

Edit:
Het object wordt nog steeds onbruikbaar zodra het oude venster gesloten is. Ook raar is dat ik geen "for (var i in node)" kan doen ("deze actie wordt niet ondersteund door dit object"), maar wel "node.cloneNode(true)". Ik krijg het idee dat het een virtueel object is, dus geen echt javascript-object, maar door Internet Explorer geëmuleerd.

[ Voor 24% gewijzigd door Verwijderd op 20-12-2006 11:37 ]

Pagina: 1