event aan popup

Pagina: 1
Acties:

  • orf
  • Registratie: Augustus 2005
  • Nu online
Ik probeer een popup te openen en daar een onunload aan te hangen, zodat content op de opener ververst kan worden.

ik probeer het als volgt (klein stukje van flinke lap code):

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
function cChildModule(){

  this.init = function(){
     ...
  }

  this.updateLinks = function(){
    
     var self = this;
     var aRows = this.oDiv.getElementsByTagName('tr');
     for (var i = 1; i < aRows.length; i++){    
        var aUri = aRows[i].getElementsByTagName('a');
        for (u=0; u< aUri.length; u++){
           aUri[u].onclick = function(e){
                stopClick(e);                       
                var oPopUp = window.open(this.href);    
                oPopUp.oChildModule = self;
                oPopUp.onload = function(){
                   alert('unload!');
                   this.oChildModule.getContent();
                };
                return false;
           }            
         }
      }
  }
}


Het scriptje loopt door een table heen op de pagina. De links in die table moeten een popup openen, in plaats van de link te volgen. Als in de popup genavigeerd wordt, moet de table ge-update worden (functie getContent()).

Ik krijg geen errors, geen alert, nix...
Gebruik in oPopUp.onunload, dan krijg ik een alert zodra de popup opent, maar als ik in de popup een link volg, gebeurt er wederom niets.

Is dit zo mogelijk, of probeer ik gewoon iets wat niet kan?

  • user109731
  • Registratie: Maart 2004
  • Niet online
orf schreef op dinsdag 07 november 2006 @ 18:49:
Als in de popup genavigeerd wordt, moet de table ge-update worden (functie getContent()).

Is dit zo mogelijk, of probeer ik gewoon iets wat niet kan?
Volgens mij is onunload aan het document gekoppeld, niet aan het window. Net als window.onload: stel je dat in dan werkt het voor die ene pagina, maar zodra je ergens anders heen gaat isie weg... :)

Let er ook op dat je niet in de pop-up een andere window.onload definieert: die overschrijft de eerste dan, en volgens mij moeten de pagina's ook van hetzelfde domein zijn.

[ Voor 15% gewijzigd door user109731 op 07-11-2006 19:25 ]


  • orf
  • Registratie: Augustus 2005
  • Nu online
In de popup kan ik gewoon weer een script gebruiken, een andere (mooie) manier om de opener te update bij navigeren is ook prima, maar ik wil graag het object doorgeven, zodat de popup 'weet' welk element in de opener (welke table) geupdate moet worden.

Als laatste redmiddel kan ik de popup een Get var meegeven (de naam van het object) en met PHP deze aan onload of onunload knopen. Als een JS only oplossing mogelijk is, dan ben ik blij :)

  • user109731
  • Registratie: Maart 2004
  • Niet online
Heb je een goede reden om de onload handler op je hoofdpagina in te stellen voor de popup, en niet gewoon in de popup zelf? Het eerste werkt vrijwel zeker, bij het laatste vraag ik me af of je een functie op een andere pagina in kunt stellen :)

GET-variabelen kun je trouwens ook met javascript uitlezen :)

[ Voor 65% gewijzigd door user109731 op 07-11-2006 21:06 ]


  • orf
  • Registratie: Augustus 2005
  • Nu online
Ik zal even wat meer uitleg geven over het systeem dat ik heb gemaakt / aan het maken ben.
In PHP heb ik een modulair cms geschreven. Met een simpel scriptje maak je een nieuwe module, zo'n module bestaat uit (formulier) elementen.

Een module heeft als 'startpagina' een overview met records, klik je op een record dan bewerk je deze. Het systeem heeft verschillende viewmodes; een viewmode popup hangt de module in een template zonder menu, passend in een popup. Een viewmode ajax geeft alleen de overviewtable, zonder onnodige html.

Als element heb ik ook een childmodule. Een childmodule is een standaardmodule, maar wordt met een foreignkey een child van de huidige module. Daarvoor haal ik met ajax de childmodule binnen en pas ik met javascript de links aan in de overview, zodat er popups getoond worden voor het editen van een record en moet de overview updaten als er iets gewijzigd is.

Omdat één module oneindig veel childmodules kan bevatten, heb ik er een oject van gemaakt. Na het aanroepen van de childmodule functie in PHP hoeft er dan alleen maar een javascript object gestart te worden die de juiste variabelen krijgt. Een popup 'weet' in principe niet dat de overview na iedere pagerefresh ge-update moet worden.

Omdat een popup ook geopend kan worden om bijvoorbeeld een select te updaten binnen een module, wil ik zo min mogelijk in de popup afhandelen, maar het liefst alles binnen het element.

Sorry voor het lange verhaal, misschien helpt de achtergrond mee om de mooiste oplossing te vinden.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

In IE krijg ik de onunload handler inderdaad niet aan de praat vanuit de opener. In Firefox wel, echter moet je de handler dan wel na een kleine timeout toekennen om de eerste 'alert' te voorkomen.

Edit: dit werkt hier wel in IE
JavaScript:
1
2
3
4
5
6
7
8
9
var win = window.open('blank.html');
setTimeout(addonunloadhandler, 10);
function addonunloadhandler()
{
    if (!win.document || !win.document.body)
        setTimeout(addonunloadhandler, 10);
    else
        win.document.body.onunload = function() { alert('close!'); }
}

(maar niet in andere browsers :P )

[ Voor 47% gewijzigd door crisp op 07-11-2006 23:53 ]

Intentionally left blank


  • orf
  • Registratie: Augustus 2005
  • Nu online
IE only is geen oplossing :P

Ik kan niets anders bedenken dan een global var:

JavaScript:
1
2
var win = window.open('blank.html');
win.oObject = this;


In de popup:

JavaScript:
1
2
3
4
5
6
if (this.oObject){
 parent.opener.oObject = this.oObject;
}
if (parent.openen.oObject){
 // doe iets met het object (onload / onunload)
}


Dit werkt, maar daar ben ik niet zo gelukkig mee, omdat ik bang ben om vars te overschrijven.

Bedankt voor het meedenken! :)

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Dus zal je een of andere browsercheck moeten doen ;)

Intentionally left blank


  • user109731
  • Registratie: Maart 2004
  • Niet online
Gewoon nieuwsgierig, maar waarom doe je eigenlijk dit in de popup:

JavaScript:
1
 parent.opener.oObject = this.oObject;

Het hele idee is toch juist dat je aan de popup een reference naar je oorspronkelijke object hangt? En dat je die dus direct kan gebruiken in de popup, dus zo:
JavaScript:
1
2
3
if (oObject){
 oObject.actionX();
} 

  • orf
  • Registratie: Augustus 2005
  • Nu online
Het hele idee is toch juist dat je aan de popup een reference naar je oorspronkelijke object hangt? En dat je die dus direct kan gebruiken in de popup, dus zo:
Dat is weg na een pagina refresh. Het moet pas uitgevoerd worden na een refresh.
Dus zal je een of andere browsercheck moeten doen
Ik krijg het niet werkend in Firefox. Ik vind het wel mooi hoe je het met een timeOut doet zodat het object altijd blijft bestaan.
Pagina: 1