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 :

Compter le nombre de liens


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Par défaut Compter le nombre de liens
    Bonjour,

    Je viens d'apprendre le javascript en cours et je n'ai aucune base si ce n'est que le langage java lui même bref. Pour un td on doit compter le nombre de liens (a) contenu dans un éléments (li). Je n'ai vraiment pas d'idée sur le code. Pour compter le nombre de lien ok, mais sinon...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
     
          function compter() {
    	  	var a = document.getElementsByTagName('a');
    		var cpt = 0;
    		for (var i=0,c = a.length; i < c; i++){
    				cpt = cpt + 1;
    		}
    		alert(cpt);
    	  }
    </script>

    Comme spécifier que les liens doivent être contenus dans des "li" ?

    Merci.

  2. #2
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     var lis = document.getElementsByTagName('li'),cpt=0;
     for(var i=0;i<lis.length;i++)
     	cpt += lis[i].getElementsByTagName('a').length;
     alert(cpt);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Par défaut
    Merci Willpower, mais si le lien est fils d'un paragraphe et que ce paragraphe est fils d'un li alors il sera comptabilisé et ce n'est pas le résultat souhaité.

    Par exemple pour ce code ça doit retourner 5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <ul>
       <li> xxxx <a href=""> yyy</a> zzz </li>
       <li> xxxx <a href=""> yyy</a> zzz <a href=""> yyy</a></li>
       <li> xxxx </li>
    </ul>
    <ul>
       <li> xxxx <a href=""> yyy</a> zzz </li>
       <li> xxxx <a href=""> yyy</a> zzz <p><a href=""> yyy</a></p></li>
       <li> xxxx </li>
    </ul>

  4. #4
    Invité
    Invité(e)
    Par défaut
    et avec l'objet links

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monelement.links.length;

  5. #5
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Citation Envoyé par jeremux Voir le message
    Merci Willpower, mais si le lien est fils d'un paragraphe et que ce paragraphe est fils d'un li alors il sera comptabilisé et ce n'est pas le résultat souhaité.

    Par exemple pour ce code ça doit retourner 5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <ul>
       <li> xxxx <a href=""> yyy</a> zzz </li>
       <li> xxxx <a href=""> yyy</a> zzz <a href=""> yyy</a></li>
       <li> xxxx </li>
    </ul>
    <ul>
       <li> xxxx <a href=""> yyy</a> zzz </li>
       <li> xxxx <a href=""> yyy</a> zzz <p><a href=""> yyy</a></p></li>
       <li> xxxx </li>
    </ul>
    et il pourra même être comptabilisé 2 fois dans le cas des li imbriqué ! au temps pour moi, ma réponse est totalement incorrecte !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Par défaut
    pas de soucis je pense que je n'ai pas assez détaillé le problème. J'ai essayé ça mais rien de concluant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
     
          function compter() {
    	  	var li = document.getElementsByTagName('li').childNodes;
    		var cpt = 0;
    		for (var i=0; i<li.length; i++){
    				cpt = cpt + li[i].getElementsByTagName("a").length;
    				}
    		alert(cpt);
    	  }
    </script>

  7. #7
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     	var li = document.getElementsByTagName('LI'),cpt=0;
    	for(var i=0;i<li.length;i++) {
     		var child = li[i].childNodes;
     		for(var j=0;j<child.length;j++)
    			if(child[j].nodeName == 'A')
    				cpt++;
    	}
     	alert(cpt);

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Par défaut
    Merci WillPower ça marche Je vais essayer de comprendre où j'ai coincé dans mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function compter() {
    	  	var a = document.getElementsByTagName('a');
    		var cpt = 0;
    		for (var i=0; i<a.length; i++){
    			if (a[i].parentNode==(document.getElementsByTagName('li'))[0]){
    				cpt = cpt + 1;
    				}
    		}
    		alert(cpt);}
    (Si quelqu'un voit l'erreur n'hésitez pas, sinon je verrais demain avec la prof)


    Merci à tous!

  9. #9
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Citation Envoyé par jeremux Voir le message
    Merci WillPower ça marche Je vais essayer de comprendre où j'ai coincé dans mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function compter() {
    	  	var a = document.getElementsByTagName('a');
    		var cpt = 0;
    		for (var i=0; i<a.length; i++){
    			if (a[i].parentNode==(document.getElementsByTagName('li'))[0]){
    				cpt = cpt + 1;
    				}
    		}
    		alert(cpt);}
    (Si quelqu'un voit l'erreur n'hésitez pas, sinon je verrais demain avec la prof)


    Merci à tous!
    correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function compter() {
    	  	var a = document.getElementsByTagName('a'), cpt=0;
    		for (var i=0; i<a.length; i++)
    			if (a[i].parentNode.nodeName == "LI")
    				cpt++;
    		alert(cpt);
    }
    ta solution ne comportant qu'une boucle est bien meilleure que la mienne.

    sinon ton erreur :
    if (a[i].parentNode==(document.getElementsByTagName('li'))[0])
    ça comparait le noeud parent de ton lien (jusque là ok)
    au premier ([0]) li récupéré dans le tableau de tous les li de ta page !

  10. #10
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    (Si quelqu'un voit l'erreur n'hésitez pas, sinon je verrais demain avec la prof)
    si tu parles du code mis avec ce message voici 2 commentaires
    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
    function compter() {
      //--------------------------------------
      // peut etre remplace par document.links
      //--------------------------------------
      var a = document.getElementsByTagName('a');
      var cpt = 0;
      for (var i = 0; i < a.length; i++) {
        //-------------------------------------------------------
        // reducteur tu ne compares qu'avec le 1st LI du document
        // si le 1st LI n'a pas de A alors tu auras 0
        // si le 1st LI a un A alors tu auras 1
        //-------------------------------------------------------
        if (a[i].parentNode == (document.getElementsByTagName('li'))[0]) {
          cpt = cpt + 1;
        }
      }
      alert(cpt);
    }
    document.links est une collection qui n'appartient qu'au document et non à un élément quelconque. <edit>pour répondre à mekal</edit>

    Tu aurais également pu faire l'approche suivante
    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
     
    //--------------------
    // fonction generique
    //--------------------
    function getParent( elem, tag){
      var oParent = elem.parentNode;
      while( oParent){
       if( oParent.tagName == tag)
         return( true);
         oParent = oParent.parentNode;
      }
      return( false)
    }
    //--------------------
    // Debut recherche
    //--------------------
    var oLink = document.links;
    var nb = oLink.length;
    var i, count = 0;
    for( i=0; i < nb; i++){
      if( getParent( oLink[i], 'LI'))
        count++;
    }
    alert( count);
    la différence est que l'on part des A et que l'on recherche le parent ultime du type choisi, plutôt que de partir du parent ultime et de récupérer ses enfants A.

    La différence ?
    le nombre d'itération, je n'est pas testé car cela va dépendre du type de document que l'on a à scruter. C'est une alternative.

    Citation Envoyé par jeremux
    Merci Willpower, mais si le lien est fils d'un paragraphe et que ce paragraphe est fils d'un li alors il sera comptabilisé et ce n'est pas le résultat souhaité.

    Par exemple pour ce code ça doit retourner 5:
    si l'on tient compte de ce que tu écris alors un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var oLink = document.links;
    var nb = oLink.length;
    var i, count = 0;
    for( i=0; i < nb; i++){
      if( oLink[i].parentNode.tagName=='LI')
        count++;
    }
    alert( count);
    <edit>cela tombe bien, Willpower, on a répondu la même chose, mais pourquoi ne pas utiliser la collection document.links quand on recherche directement dans le document</edit>

  11. #11
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    <edit>cela tombe bien, Willpower, on a répondu la même chose, mais pourquoi ne pas utiliser la collection document.links quand on recherche directement dans le document</edit>
    parce que je ne connaissais pas

  12. #12
    Invité
    Invité(e)
    Par défaut
    document.links est une collection qui n'appartient qu'au document et non à un élément quelconque. <edit>pour répondre à mekal</edit>
    j'avait jamais essayer document.links et j'aurais pensé que sa pouvait fonctionner sur un element et bas maintenant je sais que non

  13. #13
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    Citation Envoyé par Willpower Voir le message
    parce que je ne connaissais pas
    il existe au moins 4 collections mondialement connues, enfin presque..
    - forms, celle la est surement la plus connue et la plus utilisée
    - images, qui tombe en désuétude, mais qui peut rendre de grand service de mise en page notamment
    - links, celle la elle est presque complètement oubliée à en voir les forums, et pourtant bien utile également
    - anchors que plus personne ne connaît ou presque.

    une mise en garde toutefois, IE n'accepte pas document.links('name_du_lien') alors que les autres oui...et encore plein de petit détail

    A quoi cela sert que les navigateur se décarcasse?

  14. #14
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Par défaut
    Même si la solution JS pure a été donnée, je donne quand même la mienne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /**
     * Compte le nombre de A qui sont obligatoirement dans un LI par rapport à un élément parent
     * @param elm {Element} Element parent
     * @return {Number} Nombre de A contenus dans un LI
     */
    function count(elm) {
        return Array.prototype.slice.call(elm.getElementsByTagName('a')).filter(function(a) {
            return a.parentNode.nodeName == "LI";
        }).length;
    }
    Je transforme la nodeList (qui n'est pas un Array) en Array afin d'avoir la méthode filter. Et j'utilise cette méthode pour n'avoir dans mon Array que les A qui sont fils directs d'un LI.
    Cette méthode peut-être performante si filter est natif.
    note : Cette solution ne fonctionne pas sous IE6, IE7 car ils implémentent une vieille version de Javascript (JS 1.5).

    Sinon avec des librairies on le fait en une ligne aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // pour tout le document (même code pour la plupart des librairies (mootools, jquery...)
    $$('li > a').length;
     
    //si on part d'un élément
    //mootools
    $(elm).getElements('li > a').length;
    //jquery
    $(elm).find('li > a').length;
    //prototype JS
    $(elm).select('li > a').length;
    Désolé fallait que je m'occupe un peu ce matin

  15. #15
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Citation Envoyé par Willpower Voir le message
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     	var li = document.getElementsByTagName('LI'),cpt=0;
    	for(var i=0;i<li.length;i++) {
     		var child = li[i].childNodes;
     		for(var j=0;j<child.length;j++)
    			if(child[j].nodeName == 'A')
    				cpt++;
    	}
     	alert(cpt);
    En gros c'est exactement ce que j'ai dit au 2ième post...

    C'est quoi le proverbe avec le poisson et la pêche déjà ?

    Citation Envoyé par Willpower Voir le message
    ta solution ne comportant qu'une boucle est bien meilleure que la mienne.
    Citation Envoyé par NoSmoking Voir le message
    la différence est que l'on part des A et que l'on recherche le parent ultime du type choisi, plutôt que de partir du parent ultime et de récupérer ses enfants A.

    La différence ?
    le nombre d'itération, je n'est pas testé car cela va dépendre du type de document que l'on a à scruter. C'est une alternative.
    C'est en effet une solution alternative mais qui n'est pas "bien meilleure" à l'approche par les li.

    D'accord y'a pas de boucle imbriquée mais statistiquement ça fera plus d'itération (or c'est le nombre d'itération qui fait la complexité) qu'une boucle imbriquée sur les li :
    • Une page web standard contient généralement pas mal de liens
    • Une page est généralement peu chargée en li (sémantiquement, ils dénotent une liste d'élément)
    • Les élément li sont généralement des "feuilles" (il y'a rarement une arborescence importante qui en dépend)
    • Il ne s'intéresse qu'au liens directement dépendant d'un li, ce qui évite de parcourir la sous-arborescence des li


    Donc comme le dit NoSmoking, ça dépend du style de document : dans le cas d'une table des matière ce sera équivalent, dans le cas d'un listing il sera préférable de parcourir les "a", dans une page standard (avec un header, un menu, des rubriques, un footer) il sera préférable de parcourir les "li".

    Bon, je dis ça sans avoir fait d'étude préalable mais je suis persuadé que si on choisi 10000 sites au hasard et qu'on fait le ratio a vs li sur chacune de leurs pages, ça devrait corroborer ce que je dis.

    PS :
    La page actuelle contient 440 <a et 113 <li>, chaque <li> contient un seul et unique fils, ce fils est soit un <a>, soit un <span>, soit un élément texte. Soit une complexité de 113 vs 440. ^_^

  16. #16
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Par défaut
    Citation Envoyé par Loceka Voir le message
    En gros c'est exactement ce que j'ai dit au 2ième post...

    C'est quoi le proverbe avec le poisson et la pêche déjà ?




    C'est en effet une solution alternative mais qui n'est pas "bien meilleure" à l'approche par les li.

    D'accord y'a pas de boucle imbriquée mais statistiquement ça fera plus d'itération (or c'est le nombre d'itération qui fait la complexité) qu'une boucle imbriquée sur les li :
    • Une page web standard contient généralement pas mal de liens
    • Une page est généralement peu chargée en li (sémantiquement, ils dénotent une liste d'élément)
    • Les élément li sont généralement des "feuilles" (il y'a rarement une arborescence importante qui en dépend)
    • Il ne s'intéresse qu'au liens directement dépendant d'un li, ce qui évite de parcourir la sous-arborescence des li


    Donc comme le dit NoSmoking, ça dépend du style de document : dans le cas d'une table des matière ce sera équivalent, dans le cas d'un listing il sera préférable de parcourir les "a", dans une page standard (avec un header, un menu, des rubriques, un footer) il sera préférable de parcourir les "li".

    Bon, je dis ça sans avoir fait d'étude préalable mais je suis persuadé que si on choisi 10000 sites au hasard et qu'on fait le ratio a vs li sur chacune de leurs pages, ça devrait corroborer ce que je dis.
    Oui mais il faudra ensuite détecter les A et regarder si ils sont fils directs de LI. Et ça même avec un getElementsByTagName, tu devras parcourir tous les A du LI en question.

    Ensuite oui ta solution est plus rapide :o, mais si ta page ne se comporte d'un menu en liste, tu peux être sur que ta solution ne sera pas aussi performante .
    Surtout que tu relances un getElementByTagName pour chaque LI.

    enfin bon, j'avoue que c'est du pinaillage

  17. #17
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Effectivement Loceka, ta méthode même si dans certains cas est plus rapide (ou peut être plus rapide... je n'ai non plus aucun teste ni théorie pour me baser) je pense que dans la généralité des cas elle sera plus lente. D'autant plus que comme le dit dukej, les appels en boucle de getElementByTagName vont renvoyer à chaque fois un nouveau "Array" contenant les A du LI. Et il me semble que cette création d'array(+ parcours?) va faire perdre "beaucoup" au niveau de performances. (mais ce n'est effectivement qu'une intuition, basé sur rien d'autre.).


    ps: sinon bien vu quand même, je n'avais même pas vu que dans certains cas le nombre d'itérations serait moindre.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Par défaut
    Merci à tous! Grâce à vous j'ai pu comprendre l'erreur et apprendre aussi des choses. J'apprécie également les liens fournis par Loceka, ça me permet d'approfondir mon cours.

    PS: Désolé du retard de réponse!

    A bientôt!

    Jeremux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SP-2010] Compter le nombre de cliques sur un lien
    Par diabli73 dans le forum SharePoint
    Réponses: 1
    Dernier message: 21/02/2013, 09h20
  2. Compter le nombre de clic sur un lien externe
    Par TommyWeb dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/04/2006, 12h15
  3. compter le nombre de record
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 12/03/2003, 09h53
  4. [TListView] Compter le nombre de lignes
    Par agh dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2002, 20h25
  5. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 09h41

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