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 :

[DOM]boucle de remplacement d'éléments html


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut [DOM]boucle de remplacement d'éléments html
    bonjour,
    je suis débutant en js, alors désolé si j'ai manqué quelque chose...
    Je veux remplacer les liens de class="lecteur", qui sont dans le <div class="colonne"> par un <object> (qui sera un lecteur flash)...
    Donc le code suivant fonctionne pas mal:
    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
    window.onload = function() {
    		son() ;	
    		}
     
     function son() {
     	var div = document.getElementById('colonne') ;
     	var liens = div.getElementsByTagName('a') ;
     	var i = 0 ; 
     	while ( i < liens.length ) {
     		var lien = liens[i] ;
     		if ( lien.className == 'lecteur' ) {
     			var papa = lien.parentNode ;
     			var chemin = lien.getAttribute('href') ;
     			var texte = lien.firstChild ;
     
     			var lecteur = document.createElement('object') ;
     			lecteur.appendChild(texte) ; //
     			lecteur.setAttribute( 'id' , lien)
     
     			papa.replaceChild( lecteur,lien) ;
                                   //ou: 
     			//papa.insertBefore( lecteur , lien ) ; 
     			//papa.removeChild(lien) ;
     		}
     		i++ ;
     	}
    }
    sauf que dans la boucle, le lien suivant un lien remplacé n'apparaît plus. C'est à dire que si je met document.write(lien) ; par exemple apres var lien = liens[i] ;, il me manque tous les liens qui suivent immédiatement un <a class="lecteur"> dans le tableau...
    Si je commente papa.replaceChild, ça fonctionne, il les affiche tous...
    Il semble en fait que lors d'un remplacement, il supprime l'élément de la liste 'liens', et donc c'est logique, le compte 'i' ne correspond plus... Meme si je copie la liste ( var liste = liens ; ), il semble qu'il fait une copie par référence et j'ai le même résultat...
    merci d'avance

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 098
    Points : 44 675
    Points
    44 675
    Par défaut
    Il semble en fait que lors d'un remplacement, il supprime l'élément de la liste 'liens', et donc c'est logique, le compte 'i' ne correspond plus... Meme si je copie la liste ( var liste = liens ; ), il semble qu'il fait une copie par référence et j'ai le même résultat...
    bonne analyse, il te faut replacer l'index de la nodeList

    exemple
    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
    <html>
    <head>
    </head>
    <body>
    <a href="#" class="impair">1</a><br>
    <a href="#">2</a><br>
    <a href="#" class="impair">3</a><br>
    <a href="#">4</a><br>
    <a href="#" class="impair">5</a><br>
    <a href="#">6</a><br>
    </body>
    <script type="text/javascript">
      var i, oSpan, oA, oLien = document.links;
      for( i = 0; i < oLien.length; i++){
        oA = oLien[i];
        if( oA.className == "impair"){
          // creation d'un SPAN
          oSpan = document.createElement('SPAN');
          oSpan.innerHTML = oA.innerHTML;
          // remplace element
          oA.parentNode.replaceChild( oSpan, oA);
          // replace l'index
          i--;
        }
      }
    </script>
    </html>
    pas loin de ce que tu cherches à faire

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    C'est du détail, mais tu commets quelques maladresses dans ton code.

    *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    window.onload = function() {
    	son() ;	
    }
    Pourquoi pas, mais
    est plus simple non ?

    * Il faut éviter de déclarer les variables dans les boucles. Déclare-les en début de fonction

    * Le DOM attribue automatiquement aux objets de type HTMLElement des propriétés correspondant à leurs attributs standards.
    Il me semble donc déconseillé d'utiliser getAttribute() et setAttribute() : manipuler les propriétés correspondantes est moins lourd que d'appeler une méthode qui va modifier le HTML puis forcer le DOM à se mettre à jour.

    * Tu as probablement de bonnes raisons, mais modifier la page sur le onload du body est habituellement déconseillé : autant générer la page comme on la souhaite directement sur le serveur

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut
    Merci pour les réponses:
    @noSmoking: oui en fait, jouer avec l'incrémentation me parait logique... je voulais savoir s'il y avait une autre méthode pour faire ça... Je tente et je reposte...
    @Bovino:
    Pourquoi pas, mais
    Code :
    window.onload = son;
    j'hésitais à mentionner ce problème hors topic: si je fais ça, il exécute bizarrement son; avant le chargement complet de la page (le script est dans un fichier séparé appelé dans le <head>)... donc pas de liens dans le tableau...
    Il faut éviter de déclarer les variables dans les boucles. Déclare-les en début de fonction
    genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var exemple ;
    while (...) {
        exemple = ...
    ?
    Le DOM attribue automatiquement aux objets de type HTMLElement des propriétés correspondant à leurs attributs standards.
    Il me semble donc déconseillé d'utiliser getAttribute() et setAttribute() : manipuler les propriétés correspondantes est moins lourd que d'appeler une méthode qui va modifier le HTML puis forcer le DOM à se mettre à jour.
    oups, je suis pas sûr de comprendre... tu aurais un petit exemple?
    autant générer la page comme on la souhaite directement sur le serveur
    oui, j'y ai pensé. En fait, le la question est la suivante: le contenu du site est édité par son proprio en html simple (<p>, <h1>, <ul> (oulah, ce dernier est déjà très compliqué...) ). Je ne veux pas lui demander de faire 5 ligne pour intégrer un player plusieurs fois sur une page (site de musicos ). J'ai donc pensé à js, en pensant que c'était plus simple que ça, plutôt que de parser tout le contenu html pour transformer le lien (ou un code quelconque) en <object>...
    maintenant j'essaye, j'apprends, et si ça va pas je trouverai autre chose

    merci pour ce retour, c'est exactement le genre de correction/critiques que j'attendais

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    j'hésitais à mentionner ce problème hors topic: si je fais ça, il exécute bizarrement son; avant le chargement complet de la page (le script est dans un fichier séparé appelé dans le <head>)... donc pas de liens dans le tableau...
    Oui, parce que tu as dû essayer
    dans ce cas, tu affectes à la propriété onload le résultat de l'exécution de la fonction, pas une référence à la fonction, c'est bien pour ça que j'ai proposé


    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var exemple ;
    while (...) {
        exemple = ...
    ?
    Oui, c'est tout à fait ça

    oups, je suis pas sûr de comprendre... tu aurais un petit exemple?
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var chemin = lien.getAttribute('href') ;
    ...
    lecteur.setAttribute( 'id' , lien)
    fais
    [/QUOTE]
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var chemin = lien.href;
    ...
    lecteur.id = lien;

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut
    Oui, parce que tu as dû essayer
    Code :
    window.onload = son();
    tout juste... C'est typiquement le genre de choses avec lesquelles le patauge avec js, je ne sais jamais où je suis...
    merci pour tout, je tente tout ça et vous redis...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut
    tout est ok, merci encore
    pour la question initiale, il a juste fallu ajouter 'else' devant le 'i++'...

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

Discussions similaires

  1. [XML] Simple html dom : boucle qui fonctionne une seule fois !
    Par mastergalaxy dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 24/02/2014, 18h25
  2. Réponses: 5
    Dernier message: 05/07/2011, 14h45
  3. [DOM] Erreur suite à l'ajout d'élément HTML
    Par cuisto44000 dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 16/12/2008, 00h43
  4. [DOM] dom d'éléments html
    Par Invité dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/11/2007, 22h41
  5. [DOM]Récupére la valeur d'un élément HTML
    Par kobe dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/06/2006, 20h18

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