Détecter fermeture du navigateur ?

Eléphant du PHP | 130 Messages

15 mars 2007, 15:31

Salut,

J'ai pratiquement terminée mon chat en AJAX/PHP. Tout fonctionne tres bien, à l'exception de l'affichage de la liste des connectés. Cela fonctionne à 99% bien, la liste se met a jour dans tous les cas des qu'on change de page et qu'on revient, même si on change de site.

Le seul probleme c'est, et si l'utilisateur clique sur la croix et ferme le navigateur. Là son nom reste affiché dans la liste des connectés.

J'ai déjà fais pas mal de recherches mais apparemment il n'existe aucune solution, sauf si on crée d'abord la fenêtre avec javascript. J'utilise onunload pour détecter les changements de page, mais ça ne détecte pas la fermeture du navigateur. N'y a t'il vraiment aucune solution ?

Je précise que mon chat fonctionne avec des fichiers et non une base de données. Donc comme vous pouvez le voir je suis embêté uniquement à cause d'un seul clic, c'est bête quand même.
Merci pour vos conseils.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 mars 2007, 16:54

Bizare, il me semblait pourtant que onUnload détectait la fermeture du navigateur également..

Tu as aussi la fonction onBeforeUnload a essayer éventuellement..
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 130 Messages

15 mars 2007, 18:06

J'ai failli sauter de joie. Car avec ta fonction ça marche, mais j'avais pas encore pensé à faire de tests avec deux navigateurs différents.

Si je ferme le navigateur avec IE, firefox met a jour la liste des connectes, grâce à onBeforeUnload(). Mais si je fais l'inverse, et que je ferme firefox, IE ne met pas a jour, donc a priori IE ne reconnait pas onBeforeUnload. Grrrrrrrrrrrrr

A moins que ce ne soit window.closed() que j'utilise pour savoir si je dois mettre a jour le fichier. Mais ça me fait la même chose avec onUnload(), encore des problèmes de compatibilité entre IE et firefox. Toujours IE qui fou la pagaille.

:x

Eléphant du PHP | 441 Messages

15 mars 2007, 18:26

Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Eléphant du PHP | 130 Messages

15 mars 2007, 19:15

Autant pour moi, c'est donc firefox et non IE qui ne reconnait pas onBeforeUnload(), c'est dommage car cela aurait été parfait. Mais bon c'est pas si mal, car 80% des users utilisent IE. De toute façon je suis confronté à un autre problème, car pour les personnes ayant désactiver javascript, ces personnes sont enregistrées dans le fichier des que la page du chat est chargée, donc il va falloir que je trouve un autre moyen encore, pour savoir si ces personnes sont encore dans le chat ou pas. Ou alors j'ai pensé à détruire le fichier toutes les 30 minutes. Je croyais en avoir fini, mais je sens que je vais galérer encore. :)

Eléphant du PHP | 441 Messages

15 mars 2007, 22:05

Autant pour moi, c'est donc firefox et non IE qui ne reconnait pas onBeforeUnload()
où as-tu lu ça? on dit exactement le contraire dans le post :-k
et je re-confirme cet evt est bien géré dans FF
:wink:
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Eléphant du PHP | 130 Messages

15 mars 2007, 22:22

Oui mais dans l'astuce que tu donnes, il s'agit d'une frame, en utilisation normale firefox ne gère pas onBeforeUnload(). Or j'ai besoin de l'utiliser sans frames.

envahisseur a écrit:
Je te remercie mais pourrais-tu être plus précis?
De plus il me semble que l'evénement OnBeforeOnload est un événement seulement géré par IE et pas par Firefox?

David.

J'essaierai d'être un peu plus précis quand j'en aurais le temps, promis
Et je te confirme cet évènement fonctionne aussi sous FF


J'ai testé et retesté, avec onunload et onbeforeunload, ça ne marche qu'avec IE. :?

D'apres ce que j'ai lu, firefox 1.5 l'aurait supporté, mais plus maintenant apparemment.

Eléphant du PHP | 377 Messages

15 mars 2007, 23:00

Juste une suggestion comme ca, en passant, parce que ton probleme me rappelle quelque chose mais je ne me souviens plus très bien comment j'ai réglé cela:
Je suppose que sur l'évenement onbeforeunload() tu appelles une fonction AJAX. Si c'est bien le cas, essaie de passer ta fonction en synchrone (et donc fais du "SJAX" ;))
Je crois me souvenir qu'en faisant ca j'obtenais des résultats corrects
Petit scarabée deviendra grand

Eléphant du PHP | 441 Messages

16 mars 2007, 10:42

je suis désolé MAIS cela fonctionne sous FF 2.0.0.2

test.html : frameset
<html>
<head></head>
<frameset rows="*,18">
  <frame name="main" frameborder="0" src="main.html" title="contenu"></frame>
  <frame name="footer" frameborder="0" noresize="noresize" scrolling="no" src="cache.html" title="bas de page"></frame>
</frameset>
</html>
main.html : cadre principal
<html>
<head></head>
<body>
<h1>TEST</h1>
</body>
</html>
cache.html : cadre caché
<html>
<head>
</head>
<body onBeforeUnload="return confirm('sur?');" onUnload="alert('ok');"> 
</body>
</html>
Pour le système de frame, c'est le seul moyen que j'ai trouvé pour le moment...
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Eléphant du PHP | 130 Messages

16 mars 2007, 17:32

Juste une suggestion comme ca, en passant, parce que ton probleme me rappelle quelque chose mais je ne me souviens plus très bien comment j'ai réglé cela:
Je suppose que sur l'évenement onbeforeunload() tu appelles une fonction AJAX. Si c'est bien le cas, essaie de passer ta fonction en synchrone (et donc fais du "SJAX" ;))
Je crois me souvenir qu'en faisant ca j'obtenais des résultats corrects
Non, ça ne fonctionne pas en synchrone non plus.

Starkeus, je viens d'essayer ton système, ça ne marche pas non plus. Je veux dire par là que ça ne marche pas pour ce que je veux faire, autrement ça marche très bien pour appeler la fenêtre d'alerte.

Dans mon cas la fonction onbeforeunload appele un javascript qui fait une requete au serveur, c'est donc de l'ajax. Avec IE ça marche mais pas avec FF. Merci pour vos conseils. Je continue de chercher une solution.

ViPHP
ViPHP | 656 Messages

16 mars 2007, 18:54

Mais bon c'est pas si mal, car 80% des users utilisent IE
Après on s'étonne qu'il y en a qui foutent des bombes...

C'est comme si tu ignorais 20% de la population. Il doit y avoir 7% d'handicapés en france, ba tu trouve pourtant partout des rampes d'accès pour eux.

Eléphant du PHP | 130 Messages

16 mars 2007, 19:48

Mais bon c'est pas si mal, car 80% des users utilisent IE
Après on s'étonne qu'il y en a qui foutent des bombes...

C'est comme si tu ignorais 20% de la population. Il doit y avoir 7% d'handicapés en france, ba tu trouve pourtant partout des rampes d'accès pour eux.
Mon site est 100% compatible avec FF et IE, et il le restera. Ton raisonnement est poussé à l'extrème là, juste à cause de la fermeture d'une page html, lol. Dans le cas présent, comme je ne trouvais pas de solution à mon problème, j'ai dit que c'etait pas si mal. Le fait qu'un evenement javascript ne fonctionne pas bien sur un navigateur, ne limite nullement l'acces aux utilisateurs d'un navigateur ou l'autre.

Mais rassures toi je suis sur le point de trouver la solution et de faire fonctionner onbeforeunload aussi avec FF, et sans frame. :wink:

Eléphant du PHP | 130 Messages

16 mars 2007, 21:47

Voici la solution à ce problème épineux de la détection de fermeture de page. La solution est valable pour onunload et onbeforeunload. Starkeus tu peux enlever ta frameset. :)

Après de multiples tests, je vais employer personnellement onunload, car avec onbeforeunload, 1 fois sur 5, ma requete ajax ne se fait pas lorsque l'utilisateur change d'url. Avec onunload c'est 100% fiable. Et enfin que ce soit avec l'un ou l'autre, ça fonctionne parfaitement lorsque l'on clique sur la croix du navigateur.

Code : Tout sélectionner

<script type="text/javascript"> var winev = window.event; if(winev){ window.onbeforeunload = function(winev){ // FF return maFonction(winev); }} else{ window.onbeforeunload = function(){ // IE return maFonction(winev); }} function maFonction(winev){ ........... } </script>

Code : Tout sélectionner

<body onbeforeunload="javascript:maFonction(winev)">

Eléphant du PHP | 441 Messages

19 mars 2007, 12:07

bah le problème chez moi c'était que je rafraîchissait ma page principale à chaque fois... donc l'evt onunload se lançait à chaque fois. D'où la frame cachée.
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes