Comment obtenir un élément par classe en JavaScript?


226

Je veux remplacer le contenu dans un élément html donc j'utilise la fonction suivante pour cela:

function ReplaceContentInContainer(id,content) {
   var container = document.getElementById(id);
   container.innerHTML = content;
}

ReplaceContentInContainer('box','This is the replacement text');

<div id='box'></div>

Ce qui précède fonctionne très bien mais le problème est que j'ai plus d'un élément html sur une page dont je veux remplacer le contenu. Je ne peux donc pas utiliser des identifiants mais des classes à la place. On m'a dit que javascript ne prend en charge aucun type d'élément get intégré par fonction de classe. Alors, comment le code ci-dessus peut-il être révisé pour qu'il fonctionne avec des classes plutôt qu'avec des identifiants?

PS Je ne veux pas utiliser jQuery pour cela.

Réponses:


198

Ce code devrait fonctionner dans tous les navigateurs.

function replaceContentInContainer(matchClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ')
                > -1) {
            elems[i].innerHTML = content;
        }
    }
}

La façon dont cela fonctionne consiste à parcourir tous les éléments du document et à rechercher leur liste de classes matchClass. Si une correspondance est trouvée, le contenu est remplacé.

Exemple jsFiddle, utilisant Vanilla JS (c'est-à-dire sans framework)


5
+1 - Bonne prise avec les espaces, j'oublie toujours de faire ça ... je vais voler ça pour ma réponse;) la classe est un mot réservé en javascript cependant; vous ne devriez pas l'utiliser pour un nom de variable même si cela ne fait pas (encore) vraiment de mal.
Dagg Nabbit

1
@no avec cette fonction, vous n'avez pas besoin d'avoir de contenu à l'intérieur de l'élément que vous souhaitez remplacer. Vous pouvez y avoir une chaîne ou la laisser vide. Dans tous les cas, le texte de remplacement y apparaîtra soudainement lors de l'appel de la fonction.
Taylor

4
Andrew, @no - L'utilisation en classtant que nom de variable ne fonctionne pas dans Safari, donc elle a actuellement un impact.
user113716

4
Le tableau renvoyé par getElementsBytagName a également une propriété length, pour laquelle le test className / indexOf est également effectué. Bien que ce ne soit pas un problème dans ce cas, une boucle for régulière serait plus correcte.
Wolfgang Stengel

1
au lieu de indexOf avec des espaces, enregistrer elems[i].className, dire var cnet utiliser cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))fonctionnerait mieux car il correspond à tous les espaces (espace, espace insécable, tabulation, etc.) tout en permettant également la correspondance des noms de première / dernière classe. Exemple: jsfiddle.net/AXdtH/1636
Supuhstar

178

Bien sûr, tous les navigateurs modernes prennent désormais en charge la manière la plus simple suivante:

var elements = document.getElementsByClassName('someClass');

mais sachez que cela ne fonctionne pas avec IE8 ou avant. Voir http://caniuse.com/getelementsbyclassname

De plus, tous les navigateurs ne renverront pas un contenu pur NodeListcomme ils sont censés le faire.

Vous êtes probablement encore mieux en utilisant votre bibliothèque cross-browser préférée.


Pour IE8, vous pouvez utiliser querySelectorAll.
Gras Double

109
document.querySelectorAll(".your_class_name_here");

Cela fonctionnera dans les navigateurs "modernes" qui implémentent cette méthode (IE8 +).

function ReplaceContentInContainer(selector, content) {
  var nodeList = document.querySelectorAll(selector);
  for (var i = 0, length = nodeList.length; i < length; i++) {
     nodeList[i].innerHTML = content;
  }
}

ReplaceContentInContainer(".theclass", "HELLO WORLD");

Si vous souhaitez prendre en charge les anciens navigateurs, vous pouvez charger un moteur de sélection autonome comme Sizzle (4KB mini + gzip) ou Peppy (10K mini) et y revenir si la méthode native querySelector n'est pas trouvée.

Est-ce exagéré de charger un moteur de sélection juste pour que vous puissiez obtenir des éléments avec une certaine classe? Probablement. Cependant, les scripts ne sont pas si gros et vous pouvez trouver le moteur de sélection utile à de nombreux autres endroits de votre script.


@ Taylor: Je pense que cela fonctionne dans IE8 (pas sûr à 100% - trop paresseux pour google). Quoi qu'il en soit, j'ai ajouté quelques informations concernant la compatibilité descendante à l'aide de moteurs de sélection tiers.
Cristian Sanchez

18
document.querySelectorfonctionne dans IE8 et supérieur: caniuse.com/queryselector
Zeke

26

Un moyen simple et facile

var cusid_ele = document.getElementsByClassName('custid');
for (var i = 0; i < cusid_ele.length; ++i) {
    var item = cusid_ele[i];  
    item.innerHTML = 'this is value';
}

6

Je suis surpris qu'il n'y ait pas de réponses en utilisant des expressions régulières. C'est à peu près la réponse d'Andrew , en utilisant RegExp.testau lieu de String.indexOf, car il semble mieux fonctionner pour plusieurs opérations, selon les tests jsPerf .
Il semble également être pris en charge sur IE6 .

function replaceContentInContainer(matchClass, content) {
    var re = new RegExp("(?:^|\\s)" + matchClass + "(?!\\S)"),
        elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (re.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

replaceContentInContainer("box", "This is the replacement text.");

Si vous recherchez fréquemment la ou les mêmes classes, vous pouvez encore l'améliorer en stockant les expressions régulières (précompilées) ailleurs et en les transmettant directement à la fonction, au lieu d'une chaîne.

function replaceContentInContainer(reClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (reClass.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

var reBox = /(?:^|\s)box(?!\S)/;
replaceContentInContainer(reBox, "This is the replacement text.");

4

Cela devrait fonctionner dans à peu près n'importe quel navigateur ...

function getByClass (className, parent) {
  parent || (parent=document);
  var descendants=parent.getElementsByTagName('*'), i=-1, e, result=[];
  while (e=descendants[++i]) {
    ((' '+(e['class']||e.className)+' ').indexOf(' '+className+' ') > -1) && result.push(e);
  }
  return result;
}

Vous devriez pouvoir l'utiliser comme ceci:

function replaceInClass (className, content) {
  var nodes = getByClass(className), i=-1, node;
  while (node=nodes[++i]) node.innerHTML = content;
}

3

var elems = document.querySelectorAll('.one');

for (var i = 0; i < elems.length; i++) {
    elems[i].innerHTML = 'content';
};


4
Ce n'est pas vraiment une réponse. Veuillez essayer d' expliquer votre code . De plus, il s'agit essentiellement d'une version plus compacte d'une autre réponse à cette question qui a été publiée il y a 5 ans.
helmbert

Je ne sais pas quel est le problème. Cette réponse est correcte. Il n'y a pas de commentaire ... et quoi? Ce n'est pas la règle d'or. Et ce que vous voulez commenter ici? Et est-ce du code lisible?
AntiCZ

3

Je suppose que ce n'était pas une option valide lorsque cela a été demandé à l'origine, mais vous pouvez maintenant l'utiliser document.getElementsByClassName('');. Par exemple:

var elements = document.getElementsByClassName(names); // or:
var elements = rootElement.getElementsByClassName(names);

Consultez la documentation MDN pour en savoir plus.


0

Je pense que quelque chose comme:

function ReplaceContentInContainer(klass,content) {
var elems = document.getElementsByTagName('*');
for (i in elems){
    if(elems[i].getAttribute('class') == klass || elems[i].getAttribute('className') == klass){
        elems[i].innerHTML = content;
    }
}
}

travaillerait


1
si vous n'avez qu'une poignée d'éléments dans votre page, sinon c'est la solution O (N)
jwl

getAttribute ('class') semble fonctionner dans tous sauf IE, puis getAttribute ('className') fonctionne dans IE
KeatsKelleher

0

jQuery gère cela facilement.

let element = $(.myclass);
element.html("Some string");

Il modifie tous les éléments .myclass en ce texte.


PS: la question dit ".Je ne veux pas utiliser jQuery pour cela."
Julian

D'accord, je n'ai pas vu ça.
Daniel Høifødt

-15

Lorsque certains éléments manquent d'ID, j'utilise jQuery comme ceci:

$(document).ready(function()
{
    $('.myclass').attr('id', 'myid');
});

Cela peut être une solution étrange, mais peut-être que quelqu'un la trouve utile.


3
S'il y a plusieurs éléments avec la classe myclass, tous obtiendront l'identifiant myid, mais les identifiants doivent être uniques! De plus, OP dit explicitement d'éviter jQuery.
Oriol

1
Il n'est pas difficile d'ajouter une clause foreach () et un ID d'incrémentation, si vous avez plusieurs éléments de la même classe. J'ai ajouté cette solution comme alternative pour ceux qui peuvent utiliser jQuery. OP a déjà obtenu un tas de réponses appropriées de toute façon :-)
Le Krotek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.