OVH Cloud OVH Cloud

inserer un style CSS ?

23 réponses
Avatar
Olivier Miakinen
Bonjour,

J'ai encore et toujours de nouvelles questions concernant JavaScript.

Dans un document HTML, il y a un certain nombre d'éléments (div, p,
etc.) avec des attributs class="qqch". Je voudrais le plus simplement
possible changer le style 'display' de tous ces éléments, par exemple
style.display = "none".

Comme d'hab j'ai eu plusieurs idées, mais je ne sais pas laquelle est
possible.

1) Insérer un nouveau style CSS dans la feuille de style.
J'ai trouvé sur la toile des méthodes insertRule et addRule mais
aucune ne semble standard (même le nombre de paramètres de InsertRule
change entre IE6 et Gecko d'après ce que j'ai lu).

2) Rechercher tous les n½uds du document de classe "qqch".
Je suppose qu'il n'existe pas de fonction getElementByClass() ou
getElementByClassName()... faut-il que je parcoure tout l'arbre du
DOM à la recherche de ma classe ?

3) Autre chose ?

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.

10 réponses

1 2 3
Avatar
otiteca
Il faut faire les 2,

Créer une nouvelle class, et changer le classname.
je te propose ca plutot que de ne changer que l'attribut display, car si tu
as d'autres attibuts de style a changer, tu les ajoutes à la classe et le
tour est jouer.

pour rechercher tes éléments qui ont tous la meme classe, voici une fonction
qui devrait t'aider:


function FindByClassName(el, className) {

var i, tmp;

if (el.className == className)
return el;

// Search for a descendant element assigned the given class.

for (i = 0; i < el.childNodes.length; i++) {
tmp = FindByClassName(el.childNodes[i], className);
if (tmp != null)
return tmp;
}

return null;
}


SLUT.



Olivier Miakinen wrote:

Bonjour,

J'ai encore et toujours de nouvelles questions concernant JavaScript.

Dans un document HTML, il y a un certain nombre d'éléments (div, p,
etc.) avec des attributs class="qqch". Je voudrais le plus simplement
possible changer le style 'display' de tous ces éléments, par exemple
style.display = "none".

Comme d'hab j'ai eu plusieurs idées, mais je ne sais pas laquelle est
possible.

1) Insérer un nouveau style CSS dans la feuille de style.
J'ai trouvé sur la toile des méthodes insertRule et addRule mais
aucune ne semble standard (même le nombre de paramètres de InsertRule
change entre IE6 et Gecko d'après ce que j'ai lu).

2) Rechercher tous les n?uds du document de classe "qqch".
Je suppose qu'il n'existe pas de fonction getElementByClass() ou
getElementByClassName()... faut-il que je parcoure tout l'arbre du
DOM à la recherche de ma classe ?

3) Autre chose ?



Avatar
Bobe
Olivier Miakinen nous a dit le 03/02/2005 13:38:

1) Insérer un nouveau style CSS dans la feuille de style.
J'ai trouvé sur la toile des méthodes insertRule et addRule mais
aucune ne semble standard (même le nombre de paramètres de InsertRule
change entre IE6 et Gecko d'après ce que j'ai lu).



C'est effectivement la solution la plus propre et rapide.

var myCSS = document.styleSheets[x];
if( typeof(myCSS.insertRule) != 'undefined' )// W3C
{
myCSS.insertRule('.myclass { ... }', myCSS.cssRules.length);
}
else // MS
{
myCSS.addRule('.myclass', '...');
}

Il faudra faire attention à la spécificité du sélecteur utilisé. Celui
ci doit avoir assez de poids pour l'emporter sur la déclaration
précédente dans la feuille de style.

Malheureusement, cela ne marchera pas dans Opera. Celui-ci ne supporte
même pas la collection styleSheets (Sa plus grosse lacune dans son
support du DOM amha).

2) Rechercher tous les n½uds du document de classe "qqch".
Je suppose qu'il n'existe pas de fonction getElementByClass() ou
getElementByClassName()... faut-il que je parcoure tout l'arbre du
DOM à la recherche de ma classe ?



http://dev.webnaute.net/DOM/HTML/BAS/getElementsByClass

Pour le fun, la même chose en utilisant l'interface nodeIterator du DOM
traversal (La dite-interface n'est supportée que par Opera):
http://dev.webnaute.net/DOM/Traversal/BAS/getElementsByClass

--
Bobe (Aurélien Maille)
http://webnaute.net

"la vie d'un geek est un combat perpétuel contre l'imperfection"

Avatar
Olivier Miakinen

[ 1re solution ]

Malheureusement, cela ne marchera pas dans Opera. Celui-ci ne supporte
même pas la collection styleSheets (Sa plus grosse lacune dans son
support du DOM amha).


Je ne suis pas sûr de pouvoir faire l'impasse sur Opera.

Plus exactement, peut-être que mon chef serait d'accord mais moi cela me
chagrine de mettre sur la touche un navigateur récent et soucieux des
normes.

2) Rechercher tous les n½uds du document de classe "qqch".
Je suppose qu'il n'existe pas de fonction getElementByClass() ou
getElementByClassName()... faut-il que je parcoure tout l'arbre du
DOM à la recherche de ma classe ?


http://dev.webnaute.net/DOM/HTML/BAS/getElementsByClass


J'ai trouvé aussi cela :
http://daniel.glazman.free.fr/weblog/newarchive/2003_06_01_glazblogarc.html#s95287073

Je trouve malin l'idée de rajouter des espaces de chaque côté pour
pouvoir faire un indexOf au lieu de passer à l'artillerie lourde des RegExp.

Pour le fun, la même chose en utilisant l'interface nodeIterator du DOM
traversal (La dite-interface n'est supportée que par Opera):
http://dev.webnaute.net/DOM/Traversal/BAS/getElementsByClass


Bon, alors ça c'est niet pour la même raison que plus haut... enfin pour
la raison inverse... enfin bref, c'est non : je ne peux faire l'impasse
ni sur le lézard, ni sur le dinosaure.

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.


Avatar
ASM

Dans un document HTML, il y a un certain nombre d'éléments (div, p,
etc.) avec des attributs class="qqch". Je voudrais le plus simplement
possible changer le style 'display' de tous ces éléments, par exemple
style.display = "none".

Comme d'hab j'ai eu plusieurs idées, mais je ne sais pas laquelle est
possible.


Moi non plus ;-)
en voilà déjà une :

// cacheMtreTout('qqch',true/false);

function cacheMtreTout(laClasse,ouinon){
var D = document.getElementsByTagName('body')[0].childNodes;
for(var i=0;i<D.length;i++)
if(D[i].className == laClasse)
D[i].style.display = ouinon? 'block' : 'none';
}



--
*******************************************************
Stéphane MORIAUX et son vieux Mac
*******************************************************

Avatar
ASM

en voilà déjà une :


testé IE5.2 et Safari (Nouveau Mac)

--
*******************************************************
Stéphane MORIAUX et son vieux Mac
Aide Pages Perso (images & couleurs, formulaire, CHP)
http://perso.wanadoo.fr/stephane.moriaux/internet/
*******************************************************

Avatar
GraphSeb
Dans le message :,
ASM s'exclama :

en voilà déjà une :


testé IE5.2 et Safari (Nouveau Mac)


Tu aurais jeté ton NN 4 en même temps ?? 8-O

--
GraphSeb


Avatar
Olivier Miakinen

testé IE5.2 et Safari (Nouveau Mac)


Tu aurais jeté ton NN 4 en même temps ?? 8-O


Ça, c'est bas... (¹)

--
Olivier Miakinen
(¹) J'ai toujours le mien mais je ne m'en sers plus.


Avatar
Thibaut Allender
testé IE5.2 et Safari (Nouveau Mac)


nooooon? le miracle se serait-il accompli ?

--
thibaut allender | freelance | http://capsule.org

Avatar
ASM

Dans le message :,
ASM s'exclama :

testé IE5.2 et Safari (Nouveau Mac)


Tu aurais jeté ton NN 4 en même temps ?? 8-O


Et Classic ? à quoi ça sert qu'il se décarcasse ?
(je vais peut-être y mettre IE 4 en +)

La demande avait clairement écarté NN4 ce me semble.


--
*******************************************************
Stéphane MORIAUX et son vieux Mac encore d'active
*******************************************************


Avatar
ASM

testé IE5.2 et Safari (Nouveau Mac)


nooooon? le miracle se serait-il accompli ?


Ouaiai !

Classic marche super bien !
C'est fou comme c'est plus rapide !

Le X ? bon ! bof !
le plus apparent c'est surtout la poudre aux yeux


--
*******************************************************
Stéphane MORIAUX et son vieux Mac toujours d'active
*******************************************************


1 2 3