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 :

Nombre de childNodes


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2006
    Messages : 16
    Par défaut Nombre de childNodes
    Alors, je vous expose mon problème...
    voici le code html sur lequel est ciblé mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div class="news"><h3><big>GRANDE NOUVELLE !</big></h3><p class="corps">bla bla bla <span class="spoil" onClick="gere_spoil(this);">Spoil</span><div class="spoil"> rebla bla bla bla <small>bla bla toujours</small></div><br />
    <br />
    fin du bla bla</p><span class="auteur">Tsukaniki </span><span class="date"> le 18-06-2007 à 14:32:16</span></div>
    Et voici donc le code javascript de la fonction :
    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
    var spoilUncovered = false ;
    function gere_spoil(elem) {
             div_parent = elem.parentNode ;
             i_max = div_parent.childNodes.length ;
             for (i=0 ; i < i_max-1 ; i++) {
                 if (div_parent.childNodes[i] == elem) {
                    var colP = (spoilUncovered)?('#FFFFFF'):('#000000') ;
                    spoilUncovered = !spoilUncovered ;
                    div_parent.childNodes[i+1].style.color = colP ;
                    for (j=0,j_max=div_parent.childNodes[i+1].childNodes.length ; j<j_max ; j++) {
                       if (div_parent.childNodes[i+1].childNodes[j].tagName != undefined) {
                          div_parent.childNodes[i+1].childNodes[j].style.color = colP ;
                       }
                    }
                    break ;
                 }
             }
    }
    Le problème est simple : cette fonction ne marche pas... Or sur un autre de mes site, elle fonctionne parfaitement, et la seule différence entre les deux sites sont les balises.
    Dans ma recherche de la cause du problème, j'ai découvert que div_parent.childNodes.length vaut 2 . . . ce qui ne devrait pas être le cas au vu du code. Quelqu'un sait pourquoi ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut

    une petite recherche avec nodeCleaner
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2006
    Messages : 16
    Par défaut
    Hmm je suis peut-être stupide mais un nodeCleaner est sensé supprimer des nodes vides ("rajoutés" par FF), or le problème que j'ai est que seul 2 nodes fils sont trouvés au lieux de 7, donc en supprimer n'aiderai en rien... Sauf si un noeud de valeur null marque une fin de tableau ?
    De plus, j'ai testé en ajoutant un nodeCleaner justement, et le résultat est le même...
    Je vous remet le code avec le nodeCleaner
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    var notWhitespace = /\S/;
     
    var TEXT_NODE;
    try {
       TEXT_NODE = Node.TEXT_NODE;
    } catch(e) {
       TEXT_NODE = 3;
    }
     
    var ELEMENT_NODE;
    try {
      ELEMENT_NODE = Node.ELEMENT_NODE;
    } catch(e) {
       ELEMENT_NODE = 1;
    }
     
    function cleanWhitespace(node) {
      for (var x = 0; x < node.childNodes.length; x++) {
        var childNode = node.childNodes[x];
        if ((childNode.nodeType == TEXT_NODE)&&(!notWhitespace.test(childNode.nodeValue))) {
          node.removeChild(node.childNodes[x]);
          x--;
        }
        if (childNode.nodeType == ELEMENT_NODE) {
          cleanWhitespace(childNode);
        }
      }
    }
    var spoilUncovered = false ;
    function gere_spoil(elem) {
             div_parent = elem.parentNode ;
             cleanWhitespace(div_parent) ; // Si j'ai bien tout compris, c'est bien ici qu'il faut le mettre non ?
             i_max = div_parent.childNodes.length ;
             window.alert('i max vaut : '+i_max) ;
             for (i=0 ; i < i_max-1 ; i++) {
                 if (div_parent.childNodes[i] == elem) {
                    var colP = (spoilUncovered)?('#FFFFFF'):('#000000') ;
                    spoilUncovered = !spoilUncovered ;
                    div_parent.childNodes[i+1].style.color = colP ;
                    for (j=0,j_max=div_parent.childNodes[i+1].childNodes.length ; j<j_max ; j++) {
                       if (div_parent.childNodes[i+1].childNodes[j].tagName != undefined) {
                          div_parent.childNodes[i+1].childNodes[j].style.color = colP ;
                       }
                    }
                    break ;
                 }
             }
    }

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    le decompte des childNodes prend en compte également les petits enfants ...

    remplace ta balise p par un div et tu auras le nombre total de childNodes ...
    y compris les textNodes...

    il semblerait que la balise p ne tienne pas compte des textNodes...
    étant plutot une balise de mise en forme de texte plutot qu'une balise sonteneur d'objet cela ne parait pas idiot ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2006
    Messages : 16
    Par défaut
    Oui, je me suis rendu compte que le problème venait surement de la balise p, mais je souhaitais contourner le problème pour éviter de refaire la mise en forme de mon site.
    Je me suis rendu compte au fil de mes tests que la nodelist des noeuds fils d'un p s'arrête au dernier noeud inline...
    Donc apparemment pas de solutions, faut juste éviter ce cas de figure :/

    Merci pour les réponses en tout cas

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

Discussions similaires

  1. Nombre de childnodes
    Par splifferwolf dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/04/2011, 13h48
  2. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  3. [Comparatifs] Limites nombres tables et quantité de données
    Par benj63 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 13/06/2002, 21h31
  4. Nombre de fichiers ouverts simultanément
    Par matrixfan dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2002, 17h47
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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