IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[AJAX] Tchat simple en Ajax


Sujet :

JavaScript

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut [AJAX] Tchat simple en Ajax
    Bonjour à tous,

    J'ai pour l'instant une simple shoutbox en php sur mon site qui permet aux membres de communiquer rapidement. Cette shoutbox n'est pas très pratique dans le sens où il faut rafraichir toute la page pour voir s'il y a de nouveaux message.

    Je souhaiterais donc remplacer cela par une shoutbox en ajax.

    Avant de me lancer dans le code, je me pose quelques questions sur le fonctionnement générale:

    - A quelle fréquence raffraichir la liste des messages?
    - Par quel moyen pour que cela entraine le moins de requetes?
    - Comment faire pour n'afficher que les nouveaux messages ?
    petite explication: J'ai une shoutbox de 10 messages, 2 nouveaux message sarrivent depuis le dernier raffraichissement, j'affiche les deux nouveaux messages avec un style (le fond passe du rouge au blanc en fondu par exemple) et donc je supprime les deux plus vieux messages.

    Voilà les 3 questions qui me bloquent avant de me lancer dans le code.

    Avez vous des petites astuces?

    Merci d'avance.

    Ps: J'utilise prototypejs

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Bonjour,
    au niveau de la fréquence, tout dépend de ton serveur et de la charge.
    Tu peux essayer 5 secondes pour commencer.

    Au niveau du fonctionnement, ce qui me vient à l'esprit et assez simple à mettre en place, toutes les 5 secondes tu envoies avec le Datetime de la dernière réception que tu as eu. Coté serveur, il sélectionne tous les message antérieures à cette date, et te renvoit le nouveau datetime coté serveur. Tu affiches les messages recus, et stocke ce datetime que tu lui renverras dans 5 secondes.
    Après c'est du détail, en fonction du nombre de messages recus, tu supprimes de ta liste autant de messages afin de faire de la place pour les nouveaux.

    Voila
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    C'est tout à fait ce fonctionnement que je souhaite mettre en place.
    Ca serait plus du coté javascript que mon problème se pose. Comment rajouter seulement les nouveaux messages.

    Avec la fonction ajax.updater, je peux mettre à jour toute la shoutbox mais je n'arrive pas à rajouter seulement les nouveaux messages .

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Coté javascript, il te suffit de mettre chaque message dans un div, eux meme dans ta shoutbox. Si tu recois par exemple 2 messages, tu supprimes les 2 premiers div de ta shoutbox, tu en crées 2 nouveaux, que tu remplis avc les 2 nouveaux messages, et tu les ajoutes à ta shoutbox.
    Ca devrait pas poser de probleme comme cela.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Je commence tout juste à apprendre le JS et je pense qu'il faut utiliser dans ce cas les fonctions "removeChild" et "unshift"...

    Connais tu un site équivalent à php.net mais pour le JS ???

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    slt,

    il faudrait d'abord savoir où et comment tu stockes tes messages... à partir de là tu pourras définir comment les intégrer dans ta shoutbox...
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    J'ai étudié un petit peu la chose et je compte stocker les messages dans une base mysql (sauf contre-indication de votre part). La shoutbox est intégrée sur toutes les pages du site par le menu vertical du site.

    Et voici les fonctions que je pensent faire:

    - La fonction "initialisation",
    qui affiche les 30 derniers messages et qui est exécuté lors de l'affichage de la page qui contient la shoutbox.

    - La fonction "rafraichissement",
    executée toutes les 2 secondes (à confirmer) et qui permet de récupérer tous les messages dont l'id est supérieur à l'id du dernier message affiché dans la shoutbox. Si des nouveaux messages sont arrivés, ont exécute la fonction 'affiche nouveaux messages' pour chaque message.

    - La fonction "affiche nouveaux messages",
    qui supprime le plus vieux messages et affiche le nouveau message à la suite des autres.

    - La fonction "ecriture nouveaux message",
    qui rajoute un message dans la BDD et lance un rafraichissement pour voir directement son message et ne pas attendre au maximum 2s.

    Voilà à peu près tout.

    Pour moi, chaque message sera un enfant du div shoutbox. Je compte donc utiliser les différentes fonctions permettant de gerer les enfants et noeud des DOM.

    Pensez vous que je suis sur la bonne piste?

    PS: un peu HS mais je cherche également une bibliothèque pour la gestion des affichage pour les nouveaux messages qui arriveront en fondu...

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Oui, effectivement pour retirer tes messages, tu peux utiliser par exemple getElementByTagnames('div') + removeChild, et pour les ajouter, appendChild.

    Sinon au niveau de tes fonctions, elles me paraissent cohérentes.

    Et pour l'effet de fondu, la plupart des librairies sont indiquées dans le post it juste au dessus, jette y un oeil ^^
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Je ne peux pas tester ca tout de suite donc je me pose quelques questions théorique:

    Comment savoir quel sera l'enregistrement supprimé par removechild et comment savoir si l'enregistrement rajouté par appendchild se a la fin ou au début de la liste des enfants ?

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    GetElementByTagNames te renvoit un tableau de ses fils, tes messages dans ton cas. Les cases sont dans l'ordre, donc pour retirer le 1er fils, il te suffit de prendre la case d'indice 0, 1 pour le 2eme...

    Et pour appendChild, il ajoute obligatoirement à la fin des autres fils, donc pas de probleme non plus
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Une autre question pour la partie ressource; j'espere avoir une centaine de membres connectés sur le site dans quelques moi.
    Si je compte raffraichir la shoutbox toutes les 2 secondes. Cela fera donc 3000 requetes mysql par minutes. Cela me parait enorme même si la requête elle-même est assez simple et ne prend pas beaucoup de ressource.

    Je voulais donc votre avis pour cette partie. Avez vous un retour d'experience la dessus. Où sont les limites?

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Petit Up

  13. #13
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Ca me parait pas aberrant, mais bon ca dépend du serveur, des autres charges... donc comme ca on peut pas trop dire. Si tu vois que ca rame trop, tu seras obligé de limiter le nombre de membre et/ou diminuer la fréquence de raffraichissement et/ou prendre un serveur plus robuste.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    J'ai commencé à programmer réellement ce module de tchat et je rencontre un premier problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ul id="chatbox_messages">
    <li id="p9">
    test
    </li>
    <li id="p10">
    coucou
    </li>
    </ul>
    Je voudrais récuperer l'id du dernier li et je ne vois pas comment faire.
    Voilà ce que j'ai comme code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chatbox_dernier_id_msg = $('chatbox_messages').lastChild.id;
    Mais cela ne marche évidemment pas. Cela ne doit pas être compliqué pourtant.

    Avez vous une solution.

    [EDIT] Faute de syntaxe dans mon code. Ca marche.

Discussions similaires

  1. Exemple simple avec ajax et php
    Par amaubird dans le forum Langage
    Réponses: 3
    Dernier message: 17/10/2012, 19h22
  2. Réponses: 1
    Dernier message: 19/03/2012, 11h23
  3. [Prototype] Simple requête ajax de base !
    Par italiasky dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 18/12/2009, 11h21
  4. Simple ComboBox Ajax
    Par cow_boy17 dans le forum Ext JS / Sencha
    Réponses: 5
    Dernier message: 04/05/2009, 14h10
  5. [AJAX] Ajax - requête simple
    Par Liebgott dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/05/2008, 13h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo