Як отримати елемент за класом у JavaScript?


226

Я хочу замінити вміст в html-елементі, тому я використовую для цього наступну функцію:

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

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

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

Вище написане чудово працює, але проблема полягає в тому, що у мене на сторінці є більше одного html-елемента, на який я хочу замінити вміст. Тому я не можу використовувати ідентифікатори, а не класи. Мені сказали, що javascript не підтримує будь-який тип вбудованого елемента get за класовою функцією. Тож як можна переглянути вищезазначений код, щоб він працював з класами замість ідентифікаторів?

PS Я не хочу використовувати для цього jQuery.

Відповіді:


198

Цей код повинен працювати у всіх браузерах.

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

Він працює, перебираючи всі елементи документа та шукаючи їх список класів matchClass. Якщо відповідність знайдена, вміст замінюється.

Приклад jsFiddle, використовуючи Vanilla JS (тобто без рамки)


5
+1 - Добре ловити з пробілами, я завжди забуваю це зробити ... збираюся вкрасти це для моєї відповіді;) клас - це зарезервоване слово у JavaScript; ви не повинні використовувати його для імені змінної, хоча це дійсно не шкодить (поки).
Dagg Nabbit

1
@no за допомогою цієї функції вам не потрібно мати вмісту всередині елемента, який ви хочете замінити. Ви можете мати рядок там або ви можете мати його порожнім. У будь-якому випадку текст заміни раптом з’явиться там, коли викликається функція.
Тейлор

4
Andrew, @no - використання classSafari як ім'я змінної не працює, тому на даний момент це не має впливу.
user113716

4
Масив, повернутий getElementsBytagName, також має властивість довжини, для якої також робиться тест className / indexOf. Хоча це не проблема в цьому випадку, регулярне для циклу було б більш правильним.
Вольфганг Стенгель

1
замість indexOf з пробілами збереження elems[i].classNameв, скажіть var cnі використання cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))буде працювати краще, оскільки воно відповідає будь-якому пробілу (пробіл, нерозривний пробіл, вкладка тощо), одночасно дозволяючи збігати імена першого / останнього класів. Приклад: jsfiddle.net/AXdtH/1636
Supuhstar

178

Звичайно, зараз усі сучасні браузери підтримують такий простіший спосіб:

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

але будьте попереджені, він не працює з IE8 або раніше. Дивіться http://caniuse.com/getelementsbyclassname

Крім того, не всі браузери повертатимуть такий, NodeListяк вони повинні.

Вам, мабуть, все-таки краще використовувати улюблену бібліотеку крос-браузерів.


Для IE8 ви можете використовувати querySelectorAll.
Двомісний Грас

109
document.querySelectorAll(".your_class_name_here");

Це буде працювати в "сучасних" браузерах, які реалізують цей метод (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");

Якщо ви хочете надати підтримку старшим браузерам, ви можете завантажити окремий селекторний двигун типу Sizzle (4KB mini + gzip) або Peppy (10K mini) і повернутися до нього, якщо не знайдено нативної методи querySelector.

Чи надмірно завантажувати селекторний двигун просто так, щоб ви могли отримати елементи з певним класом? Ймовірно. Однак сценарії не все такі великі, і ви можете виявити, що механізм вибору корисний у багатьох інших місцях вашого сценарію.


@Taylor: Я думаю, що це працює в IE8 (не на 100% впевнений - занадто ледачий, щоб гугл). Незважаючи на те, я додав інформацію про зворотну сумісність, використовуючи сторонні селекторні двигуни.
Крістіан Санчес

18
document.querySelectorпрацює в IE8 і вище: caniuse.com/queryselector
Zeke

26

Простий і простий спосіб

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

Я здивований, що немає відповідей, що використовують регулярні вирази. Це в значній мірі відповідь Ендрю , використовуючи RegExp.testзамість цього String.indexOf, оскільки, схоже, він виконує ефективніше для декількох операцій, згідно з тестами jsPerf .
Крім того , схоже, підтримується 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.");

Якщо ви часто шукаєте один і той самий клас, ви можете його вдосконалити, зберігаючи (попередньо складені) регулярні вирази в іншому місці та передаючи їх безпосередньо функції замість рядка.

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

Це має працювати майже в будь-якому браузері ...

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;
}

Ви повинні мати можливість використовувати його так:

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
Це насправді не відповідь. Спробуйте пояснити свій код . Крім того, це в основному більш компактна версія ще однієї відповіді на це питання, яка була опублікована 5 років тому.
Гельберт

Я не знаю, в чому проблема. Ця відповідь гаразд. Немає коментарів ... а що? Це не золото правило. І що ви хочете тут прокоментувати? І чи читається код?
AntiCZ

3

Я припускаю, що це не було дійсним варіантом, коли про це спочатку запитували, але тепер ви можете використовувати document.getElementsByClassName('');. Наприклад:

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

Докладнішу інформацію див. У документації MDN .


0

Я думаю, що щось таке:

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;
    }
}
}

працювали б


1
якщо на вашій сторінці є лише кілька елементів, інакше це рішення O (N)
jwl

getAttribute ('class'), здається, працює у всіх, крім IE, тоді getAttribute ('className') працює в IE
KeatsKelleher,


-15

Коли деяким елементам не вистачає ідентифікатора, я використовую jQuery таким чином:

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

Це може бути дивним рішенням, але, можливо, хтось вважає це корисним.


3
Якщо є кілька елементів з класом myclass, всі вони отримають ідентифікатор myid, але ідентифікатори повинні бути унікальними! Більше того, ОП прямо говорить, щоб уникнути jQuery.
Оріол

1
Якщо не мати декількох елементів одного класу, не важко додати застереження foreach () та приріст. Я додав це рішення як альтернативу тим, хто може використовувати jQuery. ОП вже отримала купу придатних відповідей у ​​будь-якому випадку :-)
Krotek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.