[Javascript] Reload event, hoe te vangen?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi. Ik heb me enige tijd geleden op het grote PHP/MySQL avontuur gestort om mijn eigen webstats te maken. Dat gaat tot nu toe prima, behalve 1 ding.

Ik wil per sessie de database updaten. Een sessie moet weer gesloten worden als de gebruiker het browser raam sluit. Ik lees overal dat dit niet direct in PHP kan, maar met Javascript moet door een popup raampie te laten verschijnen wanneer iemand het browserraam sluit. Het popup raampie bevat de PHP die de sessie sluit.

Ik heb die popup gemaakt. Ik vang daarom nu het onUnload event. Nadeel van onUnload is dat onUnload ook aanslaat als er van de pagina weg genavigeerd wordt doordat de gebruiker op een link klikt én onUnload slaat aan bij een reload (f5).

Het eerste probleem (het weg navigeren) heb ik opgelost door ook op onClick te testen: bij een onUnload AND onClick verschijnt de popup niet, want dan heeft iemand gewoon een link aageklikt. De popup verschijnt nu echter nog steeds wanneer iemand de pagina reload. Hoe voorkom je dit nou?

Ik zag in dit draadje dat je gebruik zou moeten maken van het Onload event, maar dat schiet volgens mij helemaal niet op, omdat het Onload event altijd gebeurt, ook bij een niet-reload.

Verder is dit draadje nog interessant, maar eerlijk gezegd begrijp ik het niet helemaal.

Wie schopt mij in de goede richting?!

/zie voor een voorbeeldje de link in mijn sig, zowel bij reloaden als bij window sluiten komt er linksboven heel even een popup die de sessie sluit.

[ Voor 6% gewijzigd door Verwijderd op 13-02-2003 16:38 ]


Verwijderd

ik als je de popup aanroept een xtra param meegeeft (url die refreshed wordt)

het popup checkt adhv het opgegeven param of die het zelfde is als de window.opener.location, is dat het geval dan is het een reload en hoef je geen actie te ondernemen...

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Je bent imho de verkeerde kant op aan het denken en probeert een zelfgecreeerd probleem op te lossen.

Waarom zou je expliciet een sessie willen sluiten? Log gewoon ieder bezoek aan iedere pagina en vang duplicates af (heel makkelijk, bewaar laatste in sessie en controleer daarmee). Dan heb je tenminste ook statistieken van alle pagina's..

Want ik snap eigenlijk niet wat je probleem is :)

Je wilt een sessie sluiten wanneer men een venster sluit.. Ik weet niet of je het weet, maar dit gebeurt automatisch ;)

[ Voor 14% gewijzigd door Bosmonster op 13-02-2003 16:47 ]


Verwijderd

Volgens mij kan het niet, dat is volgens mij ook wat die draadjes zeggen.
Misshien kun je beter een plaatje of scriptje of frame gebruiken wat zich elke keer opnieuw herlaadt om de 10 seconden of zo. Als het herladen is afgelopen, dan is de gebruiker kennelijk verdwenen.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Verwijderd schreef op 13 February 2003 @ 16:46:
Volgens mij kan het niet, dat is volgens mij ook wat die draadjes zeggen.
Misshien kun je beter een plaatje of scriptje of frame gebruiken wat zich elke keer opnieuw herlaadt om de 10 seconden of zo. Als het herladen is afgelopen, dan is de gebruiker kennelijk verdwenen.


En het nut daarvan? :? :?

Verwijderd

Topicstarter
Bosmonster schreef op 13 February 2003 @ 16:45:
Je bent imho de verkeerde kant op aan het denken en probeert een zelfgecreeerd probleem op te lossen.

Waarom zou je expliciet een sessie willen sluiten? Log gewoon ieder bezoek aan iedere pagina en vang duplicates af (heel makkelijk, bewaar laatste in sessie en controleer daarmee). Dan heb je tenminste ook statistieken van alle pagina's..

Want ik snap eigenlijk niet wat je probleem is :)

Je wilt een sessie sluiten wanneer men een venster sluit.. Ik weet niet of je het weet, maar dit gebeurt automatisch ;)
Hrmz, meen je dat nu? Ik herinner me dat wanneer ik het raam sluit en de pagina opnieuw open, ik dezelfde session ID had. :? Iklas ook ergens dat de duur van een sessie afhangt van de instelling van PHP op de server. Correct me if i'm wrong.

[ Voor 8% gewijzigd door Verwijderd op 13-02-2003 16:59 ]


Verwijderd

Verwijderd schreef op 13 February 2003 @ 16:59:
[...]


Hrmz, meen je dat nu? Ik herinner me dat wanneer ik het raam sluit en de pagina opnieuw open, ik dezelfde session ID had. :? Iklas ook ergens dat de duur van een sessie afhangt van de instelling van PHP op de server. Correct me if i'm wrong.
je hebt gelijk, maar probeer mijn oplossing is, die vangt het reloaden van de pagina af..

zal zelf wel ff een sample schrijven...

Verwijderd

Topicstarter
Verwijderd schreef op 13 February 2003 @ 17:06:
[...]


je hebt gelijk, maar probeer mijn oplossing is, die vangt het reloaden van de pagina af..

zal zelf wel ff een sample schrijven...
Te gek, ik was net aan het nadenken over jouw oplossing. :)

/Misschien zit hier 1 probleem aan. Op het moment dat de popup geladen wordt, wordt dan eerst de javascript of eerst de PHP geïnterpreteerd? PHP toch?
In de popup zit namelijk een php script dat de sessie beëndigt. Stel dat het javascript in de popup ontdekt dat er sprake is van een reload, kan je die PHP dan nog wel stoppen?

/ik ontdek net dat die popup ook nog verschijnt als je op de back button in je browser klikt. :D Daar is gelukkig makkelijk wat aan te doen.

[ Voor 48% gewijzigd door Verwijderd op 13-02-2003 17:13 ]


Verwijderd

Verwijderd schreef op 13 februari 2003 @ 17:07:
[...]


Te gek, ik was net aan het nadenken over jouw oplossing. :)

/Misschien zit hier 1 probleem aan. Op het moment dat de popup geladen wordt, wordt dan eerst de javascript of eerst de PHP geïnterpreteerd? PHP toch?
In de popup zit namelijk een php script dat de sessie beëndigt. Stel dat het javascript in de popup ontdekt dat er sprake is van een reload, kan je die PHP dan nog wel stoppen?

/ik ontdek net dat die popup ook nog verschijnt als je op de back button in je browser klikt. :D Daar is gelukkig makkelijk wat aan te doen.
Mmm het klonk makkelijker dan het was...

als je het hoofdvenster dichtgooit, en je laad de popup dan is er geen window.opener meer waardoor window.opener.location een foutmelding geeft, toegang gewijgerd, dit krijg je ook als je naar een andere site surft..

kijk maar ff op nieuws.xs4all.nl/got/index.html dat kun je gebruiken om uit te bouwen, reloaden pikt ie netjes op en laat het venster sluiten. Nu moet je alleen nog ff die error escapen, en dan kan je doen wat je wil met die pagina...

succes

Verwijderd

Topicstarter
Bedankt, ik ga het even uitpluizen! :)
Wat denk je van mijn bovenstaande vraag? Als de popup geopend is en de popup (javscript) een reload detecteert, kan je de php in die popup dan nog wel stoppen?

[ Voor 35% gewijzigd door Verwijderd op 13-02-2003 17:29 ]


Verwijderd

Verwijderd schreef op 13 februari 2003 @ 17:27:
[...]


Bedankt, ik ga het even uitpluizen! :)
Wat denk je van mijn bovenstaande vraag? Als de popup geopend is en de popup (javscript) een reload detecteert, kan je de php in die popup dan nog wel stoppen?
Jup, je laat de php alleen uitvoeren als je een bepaalde querystring meegeeft, bijv "?action=killsession"

omdat dit de 1e ker dat het wordt aangeroepen ontbreekt wordt de code niet meteen uitgevoerd, dan laad het javascript document, deze kijkt of het een reload is, zo ja venster dicht... Zo nee?! Dan reload het venster met de goede querystring, waardoor de php wel wordt utigevoerd, zal dat nog ff in de code verwerken..

Een groot nadeel van deze oplossing is dat als je reload je iedere keer een popup ziet openen en sluiten... ga ff een oplossing bedenken die dit voorkomt...

nog effe verder geprutst en gegoogled het lijkt voor het moment niet echt waarschijnlijk dat je verder komt met dit probleem...

je kunt wel checken op document.referer == document.location, maar dan laad hij de popup helemaal niet meer zien zelfs niet als je op t kruisje klikt... het popup idee zou ik eik verder laten varen...

is asp kun je een melding krijgen wanneer een sessie wordt beëndigd in de global.asa file... kijk eens of je ook zoiets met php kan maken...

[ Voor 22% gewijzigd door Verwijderd op 13-02-2003 18:04 ]


Verwijderd

Topicstarter
Heej, het lijkt erop alsof ik een beetje brakke PHP heb geschreven gisteren. Ik heb het hele javascript gedeelte geschrapt en ben gaan testen met PHP sessies. Nu blijkt dat ik toch een nieuwe sessionid() krijg als ik het raam sluit en opnieuw open. De sessie wordt dus automatisch gesloten als ik het raam sluit. :+

Nu kan ik per sessie een rij aanmaken in de tabel en als een gebruiker binnen 1 sessie meerder pagina's van de site bezoekt, wil ik alle bezochte pagina's in één veld van die rij hebben.

Ik ga hiervoor selecteren op id, die als primary key (int) ingesteld staat. Lijkt me een ok plan toch? Of zal ik liever op session id selecteren?


Bedankt voor jullie hulp tot nu toe, speciaal Mabit :>

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Verwijderd schreef op 13 februari 2003 @ 16:59:
[...]


Hrmz, meen je dat nu? Ik herinner me dat wanneer ik het raam sluit en de pagina opnieuw open, ik dezelfde session ID had. :? Iklas ook ergens dat de duur van een sessie afhangt van de instelling van PHP op de server. Correct me if i'm wrong.



Nee dit klopt niet.. Zodra je je browsers sluit en een nieuwe opent, heb je een nieuwe sessie-ID. Als je nieuwe vensters openet van een bestaande sessie dan gebruiken die wel dezelfde. Als je een volledig nieuwe browser opstart (dus geen nieuw vensteR) dan krijgt ook die een andere sessie en heb je dus 2 sessies draaien.

Hangt er dus vanaf of sluiten van het venster de sessie beeindigt of er nog vensters in dezelfde sessie open zijn :)

[edit: achter die conclusie ben je in je laatste post ook gekomen zie ik :)]

Ik heb zelf ook een module geschreven in PHP die users logt in een website, maar ben nooit met dit soort ongein aan de gang gegaan.. op dat moment is je script ook absoluut niet portable meer natuurlijk.. Een Nedstat kan het ook met een gifje, dus waarom zou jij daar hele onunload sessie-kill scripts voor moeten gaan schrijven :)

Mijn versie werkt ook simpelweg met het ophalen van een plaatje, dit plaatje is eigenlijk een PHP script en slaat zut op in de database.
Nu kan ik per sessie een rij aanmaken in de tabel en als een gebruiker binnen 1 sessie meerder pagina's van de site bezoekt, wil ik alle bezochte pagina's in één veld van die rij hebben.
Ehhh.. wat ga je doen? Alle bezochte pagina's per rij in 1 veld??? En hoe wil je daarop gaan sorteren, of daar nuttige informatie uit halen? Sla gewoon een record op per bezoek, gooi er een timestampje bij en je weet ook precies welk pad mensen volgen door je site, zonder er dalijk ingewikkelde en rete-trage MySQL string functies op los te hoeven laten :)

Met jouw methode kun je dalijk onmogelijk bijvoorbeeld de bezoekers PER PAGINA gaan achter halen. De key in een sitestatistieken is juist altijd de bezochte pagina! Niet de gebruiker!

[ Voor 51% gewijzigd door Bosmonster op 14-02-2003 00:39 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Pffft, die Nedstat methode met het plaatje gaat me een beetje boven mijn pet eerlijk gezegd. Er wordt eerst een javascript opgevraagd en vervolgens 2 waarden naar een functie uit dat script gepaast, waarvan de eerste een identificatiestring is iig, daarna wordt ongetwijfeld een php file aangeroepen. Voor de rest....

Ik maak dus per sessie een rij aan in tabel 'sessionstats', waarin de "referrer", het "ip", de "tijd/datum", de "browser" en de "huidige pagina" komen te staan. Dit gebeurt net nadat de sessie gestart is.
Deze rij is te herkennen aan 'id' (auto_increment, primary key, int).
Als een gebruiker naar een andere pagina binnen mijn site surft, wordt ALLEEN het "huidige pagina" veld geupdate met . $de nieuwe 'huidige pagina'.

Zo kan ik in een keer aan het 'huidige pagina' veld van elke sessie zien, hoe een gebruiker door mijn site is gegaan.

Dit betekent dat ik per pagina kijk of de sessie al gestart is. Is dat niet het geval, dan wordt er een nieuwe record aangemaakt en gevuld met bovenstaande meuk. Als de sessie wél al gestart is, update ik alleen 'huidige pagina' en eventueel nog een nieuwe kolom waarin ik het aantal hits per pagina bijhoudt.


De stats opvragen doe ik met DESC, zodat ik alleen de (bijvoorbeeld) laatste 25 records pak. Ik zie dan van de laatste 25 gebruikers

- wanneer en hoe laat ze binnen kwamen
- hoe ze op mijn site terecht kwamen
- op welke pagina ze mijn site binnen kwamen
- wat hun ip is
- welke browser/os ze gebruiken
- welke pagina's ze in welke volgorde allemaal bezocht hebben voordat ze weer verdwenen

Daarnaast zie ik aan id het totaal aantal UNIEKE gebruikers (nou ja, unieke sessies, da's wat anders). Eventueel kan ik nog een aparte query voor het aantal hits/page doen, maar hier maak ik dan een nieuwe PHP statistieken pagina voor.

Ik begrijp dat jij per hit een record maakt. Ik had dat eerst ook, maar ik had het idee dat je daarvoor juist hele zware queries nodig had. Stel dat je uit zo'n enorme database het aantal unieke gebruikers wil pakken, dan moet je toch op ip gaan selecteren? Is dat niet zwaar?


/Als je denkt, die jongen heeft een tutorial nodig, fine. Als je een link hebt waar dit besproken wordt, graag. Ik weet zelf niet zo heel goed waar ik op moet zoeken. Ik heb al wat gezocht op 'MYSQL database optimization', maar vind niets wat nuttig is voor mij.

[ Voor 22% gewijzigd door Verwijderd op 14-02-2003 04:20 ]


Acties:
  • 0 Henk 'm!

Verwijderd

ik heb zlef zoiets werkend in asp, maar daarvoor hoefde ik niet van die kunsttrucen uit te halen, bovendien had ik naast sessie ook een tabel users, zodat ik met een cookie een bepaalde user kon herkennen, en in je stats kan je dan zien hoeveel sessie bepaalde user heeft gestart en wanneer.

Dus User > Session > Pageviews...

Overigens als je een timestamp in de db op laat slaan kun je heel nauwkeuring bekijken hoelang iemand op je pagina is geweest.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Verwijderd schreef op 14 februari 2003 @ 04:11:
Pffft, die Nedstat methode met het plaatje gaat me een beetje boven mijn pet eerlijk gezegd. Er wordt eerst een javascript opgevraagd en vervolgens 2 waarden naar een functie uit dat script gepaast, waarvan de eerste een identificatiestring is iig, daarna wordt ongetwijfeld een php file aangeroepen. Voor de rest....
[/nohtml]
De nedstat methode lijkt misschien ingewikkelder dan die is :) Probeer maar eens het volgende (javascript):

code:
1
2
statImg = new Image();
statImg.src = "/stats/counter.php";


Bijvoorbeeld, en kijk dan eens wat voor een input je allemaal krijgt in counter.php. Dit blijkt namelijk exact hetzelfde als je een normale pagina oproept :) Het enige dat ontbreekt is de referrer, maar die kunnen we ook middels javascript toevoegen, dit werkt namelijk ook gewoon :)

code:
1
statImg.src = "/stats/counter.php?r="+escape(document.referrer);


Zo kun je vanalles clientside meegeven wat je serverside nooit uit kan lezen, zoals gebruikte resolutie of geinstalleerde Flash-versie. Let er wel op dat je in je counter.php dan caching disabled, anders cached de browser het als een plaatje. Je kunt ook gewoon een random string hierboven eraan vastplakken als volgende argument. Als je niet met codes wilt werken voor de pagina's kun je hier ook gewoon de document.location.href meesturen (dat zoe ik zelf).

Of je het gaat gebruiken of niet, het is leuk om eens mee te experimenteren!
[/nohtml]
Ik begrijp dat jij per hit een record maakt. Ik had dat eerst ook, maar ik had het idee dat je daarvoor juist hele zware queries nodig had. Stel dat je uit zo'n enorme database het aantal unieke gebruikers wil pakken, dan moet je toch op ip gaan selecteren? Is dat niet zwaar?


Dit valt erg mee, zolang je de indices op de tabel maar goed hebt gedefinieerd. Zelf sla ik ook unieke sessie-Id en IP op en aan de hand van die combinatie bepaal ik het aantal unieke bezoekers. Zo kan ik in 1 query een overzicht genereren van bezoekers per pagina, per tijdseenheid of dingen als gemiddeld aantal bezochte pagina's per gebruiker.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Joh, dat klinkt allemaal erg goed. Ik ga er zeker mee experimenteren. Het is voor mij wel een 'change of tactics' maar ik wil het het liefst in een keer zo efficiënt mogelijk doen. :)
Mijn vriendin is net voor 10 dagen op vakantie, dus ik kan er onafgebroken aan werken :P

Bedankt!

[ Voor 9% gewijzigd door Verwijderd op 14-02-2003 15:36 ]

Pagina: 1