Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/03/2011, 17h27   #1
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
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 :
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
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 18h41   #2
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 930
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 930
Points : 4 744
Points : 4 744
Citation:
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 :
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
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 19h41   #3
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 805
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 805
Points : 35 807
Points : 35 807
C'est du détail, mais tu commets quelques maladresses dans ton code.

*
Code :
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
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 22h04   #4
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
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:
Citation:
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...
Citation:
Il faut éviter de déclarer les variables dans les boucles. Déclare-les en début de fonction
genre:
Code :
1
2
3
4
 
var exemple ;
while (...) {
    exemple = ...
?
Citation:
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?
Citation:
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
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 22h27   #5
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 805
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 805
Points : 35 807
Points : 35 807
Citation:
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é


Citation:
genre :
Code :
1
2
3
var exemple ;
while (...) {
    exemple = ...
?
Oui, c'est tout à fait ça

Citation:
oups, je suis pas sûr de comprendre... tu aurais un petit exemple?
Au lieu de
Code :
1
2
3
var chemin = lien.getAttribute('href') ;
...
lecteur.setAttribute( 'id' , lien)
fais
[/QUOTE]
Au lieu de
Code :
1
2
3
var chemin = lien.href;
...
lecteur.id = lien;
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 23h06   #6
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
Citation:
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...
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 23h20   #7
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
tout est ok, merci encore
pour la question initiale, il a juste fallu ajouter 'else' devant le 'i++'...
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h35.


 
 
 
 
Partenaires

Hébergement Web