Ik ben bezig een chatbox te ontwikkelen die gebruik maakt van JavaScript en PHP (met AJAX). Als de gebruiker de subpagina domein.nl/chatbox opent, dan wordt hij toegevoegd aan een "online users" rijtje. Als de gebruiker de pagina verlaat moet hij weer uit dat rijtje verdwijnen. Ik doe dat als volgt:
1. De chatbox pagina heeft een window.onBeforeUnload event listener die via AJAX de gebruiker uit de database verwijdert als hij de pagina verlaat.
2. De gebruiker doet elke halve seconde via AJAX een request om nieuwe berichten. Als ik twee seconden lang geen nieuwe aanvraag binnenkrijg, ga ik ervanuit dat de gebruiker offline is en verwijder ik hem uit de database. Dit kan door elke paar seconden een PHP script te draaien (wat ik nog moet schrijven
)
Stap 2 is nodig omdat onBeforeUnload niet betrouwbaar is; een gebruiker kan javascript uitschakelen nadat hij de chatbox opent, of de stekker uit zijn modem trekken. In beide gevallen vuurt BeforeUnload niet en blijft de user aanwezig in de database. Toch vind ik het de moeite waard om BeforeUnload te gebruiken, omdat 99% van de gebruikers netjes de pagina zal verlaten of de browser zal sluiten.
Het probleem is dat Firefox en IE een andere interpretatie van het BeforeUnload event hebben. IE7 vuurt het event af als de gebruiker wegsurft naar een willekeurige andere pagina, ook als hij klikt op een internal anchor. FF2 doet dat niet. In de firefox changelog heb ik een bugfix gevonden die volgens mij dit gedrag veroorzaakt. Andere browsers heb ik niet getest.
Als FF gebruikers dus op een interne link klikken terwijl ze in de chatbox zitten, dan blijft hun status online. Ik zoek een efficiënte manier om firefox een event te laten afvuren op het moment dat de gebruiker de pagina verlaat, ook als hij dat doet door een andere subpagina te kiezen.
Ik zou misschien de mouseclicks kunnen afluisteren om te zien of de gebruiker op een interne link klikt, maar dat vind ik een 'vieze' oplossing.
Een workaround is alle interne anchors vervangen door externe, maar dat is geen echte oplossing en bovendien erg onhandig.
edit: het event lijkt soms wel te vuren. Als een alert("hi"); aan de event handler toevoeg, voor of na de AJAX request, vuurt hij altijd.
1. De chatbox pagina heeft een window.onBeforeUnload event listener die via AJAX de gebruiker uit de database verwijdert als hij de pagina verlaat.
2. De gebruiker doet elke halve seconde via AJAX een request om nieuwe berichten. Als ik twee seconden lang geen nieuwe aanvraag binnenkrijg, ga ik ervanuit dat de gebruiker offline is en verwijder ik hem uit de database. Dit kan door elke paar seconden een PHP script te draaien (wat ik nog moet schrijven
Stap 2 is nodig omdat onBeforeUnload niet betrouwbaar is; een gebruiker kan javascript uitschakelen nadat hij de chatbox opent, of de stekker uit zijn modem trekken. In beide gevallen vuurt BeforeUnload niet en blijft de user aanwezig in de database. Toch vind ik het de moeite waard om BeforeUnload te gebruiken, omdat 99% van de gebruikers netjes de pagina zal verlaten of de browser zal sluiten.
Het probleem is dat Firefox en IE een andere interpretatie van het BeforeUnload event hebben. IE7 vuurt het event af als de gebruiker wegsurft naar een willekeurige andere pagina, ook als hij klikt op een internal anchor. FF2 doet dat niet. In de firefox changelog heb ik een bugfix gevonden die volgens mij dit gedrag veroorzaakt. Andere browsers heb ik niet getest.
Als FF gebruikers dus op een interne link klikken terwijl ze in de chatbox zitten, dan blijft hun status online. Ik zoek een efficiënte manier om firefox een event te laten afvuren op het moment dat de gebruiker de pagina verlaat, ook als hij dat doet door een andere subpagina te kiezen.
Ik zou misschien de mouseclicks kunnen afluisteren om te zien of de gebruiker op een interne link klikt, maar dat vind ik een 'vieze' oplossing.
Een workaround is alle interne anchors vervangen door externe, maar dat is geen echte oplossing en bovendien erg onhandig.
edit: het event lijkt soms wel te vuren. Als een alert("hi"); aan de event handler toevoeg, voor of na de AJAX request, vuurt hij altijd.
[ Voor 3% gewijzigd door Bozozo op 31-12-2007 14:20 ]