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 :

addEventListener et événements ajax


Sujet :

JavaScript

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Points : 41
    Points
    41
    Par défaut addEventListener et événements ajax
    Bonjour,

    Je voudrais capturer les fils d'un forum de discussion (dans FUN) pour les afficher ensemble afin de faciliter une recherche par mot clé. Dans ce forum, il faut cliquer sur chacun des fils pour que la discussion s'affiche dans une div sur la même page. Lors du clic, une requête de type GET va chercher le post, mais cela prend du temps (4/5 sec.).
    Dans un script (que je colle dans une console), je parviens à cliquer sur chaque fil de discussion, et aussi à capturer le contenu du post, mais pas à être averti lorsque le post est chargé.
    Voici le script que j'utilise.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    // Ajouter une balise div ajout en fin de page si elle n'existe pas
    var div = document.getElementById("ajout")
    if (typeof(document.getElementsByClassName("ajout")[0] = 'undefined')) {
      document.getElementsByClassName("top-footer")[0].innerHTML = '<div id="ajout" style="color:#FFFFFF"></div id="ajout">';
    }
     
    function recordPost ()
    {
      // Capturer discussion-post et le placer dans une div du footer
      alert("Post reloaded");
      document.getElementById("ajout").innerHTML += '<div class="ajouts">' + document.getElementsByClassName("discussion-post")[0].innerHTML + '</div>';
    }
     
     
    document.getElementsByClassName("discussion-post")[0].addEventListener("load",recordPost, false);
     
    // recordPost(document.getElementsByClassName("discussion-post")
     
    // Ouvrir les fils de discussion un à un
    var pas;
    // var max = document.getElementsByClassName("forum-nav-thread-link").length;
    var max = 2;
    for (pas = 0; pas < max; pas++) {
      test=document.getElementsByClassName("forum-nav-thread-link")[pas].click();
      // ('<div class="discussion-post"></div>').load(console.log("chargé"));
      //window.setTimeOut(recordPost,4000) 
      console.log(pas);
    };
    D'une part, le addEventListener ne fonctionne pas et ne réagit pas lorsque ma div est rechargée ; d'autre part la boucle de clics va trop vite pour que chacun des posts ait le temps de s'afficher. Comment alors attendre le temps suffisant pour s'assurer que la div a été rechargée et la sauvegarder ensuite ?
    Ci-joint la page html en question.

    Merci de l'aide,
    Thibaud.
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip fun.zip (644,5 Ko, 59 affichages)

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Je pense que tu as surestimé l'évènement load : il ne fonctionne pas sur les divs. Je crois que tu as une requête Ajax quelque part (on ne la voit pas dans ton extrait de code) ; c'est cette requête que tu dois surveiller, avec la bonne vieille méthode onreadystatechange.

    Quelques conseils en vrac :

    Ton typeof, ligne 3 dans ton code posté, ne fait pas du tout ce que tu crois. Si on regarde les parenthèses, on a en gros ceci :
    Avec qui correspond à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementsByClassName("ajout")[0] = 'undefined'
    Tu noteras au passage qu'il manque un signe =, on a donc une affectation au lieu d'une comparaison, c'est embêtant. Il se trouve que, dans ce cas précis, l'affectation échoue silencieusement : pas de message d'erreur, pas d'interruption du script. Pour éviter ça, je te conseille d'utiliser le mode strict. Jette aussi un œil à cette pratique de codage qu'on appelle la Yoda condition.

    En fin de compte, une affectation renvoie toujours en résultat la valeur qui se trouve à droite du signe égal, en l'occurence la chaîne 'undefined'. Ton test de la ligne 3 est donc équivalent à :
    ce qui est loin, à mon avis, de se comporter comme tu le veux (indice : toutes les chaînes sauf la chaîne vide sont équivalentes à true).

    À la place de alert, utilise console.log. Ça affichera tes messages dans la console, et tu trouves cette console en appuyant sur F12 et en allant sur l'onglet « console ». Elle t'affiche également les erreurs du script, et je pense que tu en trouveras une qui parle de cette méthode .click() qui n'existe pas (ligne 24 dans ton extrait).

    À la place de innerHTML, utilise insertAdjacentHTML, il est à la fois plus pratique et plus performant.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Merci Watilin pour ces conseils utiles y compris la méthode Yoda. Il y a bien une requête Ajax GET dans le script de la page, en revanche j'ai du mal à savoir comment je peux connaître l'objet sur lequel onreadystatechange doit s'appliquer. En effet, dans le script de la page cette méthode est utilisée plusieurs fois directement avec les objets d et h et indirectement avec les objets c et a... Voici le script qui produit la requête. D'après firebug, c'est la ligne 3 qui produit le GET mais je ne suis pas sûr que ça aide vraiment.

    Ci-joint le code javascript de la page (16.000 lignes tout de même).
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip fun.zip (144,2 Ko, 50 affichages)

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    C'est du code minifié ça. On ne peut rien en tirer à moins d'avoir beaucoup de temps et beaucoup de courage.

    Je n'avais pas compris que ce n'est pas toi qui as écrit tout ce code. Pourtant ton idée de « coller un script dans la console » aurait dû me mettre la puce à l'oreille

    Je ne comprends pas le lien entre ce fichier fun.js et ceux de ton premier zip. Mais quand on regarde les scripts de ce premier zip, on constate qu'il y a du jQuery et que les appels Ajax sont probablement faits via ce framework.

    On va changer complètement de stratégie. Tu pourrais fouiller dans les différents scripts du site à la recherche de la fonction qui fait la requête qui t'intéresse, mais ça prendrait des jours (pourquoi tous ces sites qui font des choses classiques ont besoin d'avoir un code aussi compliqué ?!). Ou alors tu pourrais faire en sorte que jQuery surveille pour toi toutes les requêtes Ajax, et appelle une fonction que tu auras écrite toi-même. C'est possible avec .ajaxSuccess

    Les gestionnaires d'userscripts tels que Greasemonkey te permettent d'enregistrer un script qui sera automatiquement appelé au chargement de la page. Ça t'évite de devoir le coller dans la console à chaque fois

    En gros, voilà ce que tu devras mettre dans ton script :
    • un appel à .ajaxSuccess pour attacher ta propre fonction
    • ladite fonction, qui comprend un test sur l'URL de la requête pour savoir si la requête t'intéresse ou pas, et qui récupère les données
    • une fonction pour automatiser les clics sur tous les fils, avec un moyen d'appeler cette fonction (injecter un bouton dans la page par exemple). Je te conseille de mettre les clics les uns après les autres, et non pas tous en même temps ; vu que les requêtes sont apparemment longues à charger, c'est le signe que le serveur a du mal à gérer la charge, et en faisant des requêtes en parallèle, au mieux la plupart vont échouer, au pire ça pourrait passer pour une tentative de DoS et t'attirer des ennuis :/
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. remplir une combo suite à un évènement ajax avec dwr
    Par coco-sup dans le forum Struts 1
    Réponses: 6
    Dernier message: 23/01/2013, 14h48
  2. Réponses: 1
    Dernier message: 03/05/2012, 11h29
  3. [AJAX] Emettre un son lors d'un évènement AJAX
    Par nicoprec dans le forum AJAX
    Réponses: 9
    Dernier message: 30/07/2011, 21h53
  4. [AJAX] événement après insertion code ajax
    Par jerome38000 dans le forum AJAX
    Réponses: 5
    Dernier message: 06/06/2009, 10h01
  5. [AJAX] Décalage entre évènement et renvoi serveur
    Par Aurias dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/06/2006, 15h45

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