Як я можу змінити клас елемента за допомогою JavaScript?


2776

Як я можу змінити клас HTML-елемента у відповідь на onclickподію за допомогою JavaScript?


28
"Атрибут класу використовується в основному для вказівки на клас у таблиці стилів. Однак він також може використовуватися JavaScript (через HTML DOM) для внесення змін до елементів HTML із заданим класом." - w3schools.com/tags/att_standard_class.asp
Трайнко

11
element.setAttribute(name, value); Замініть nameна class. Замініть valueбудь-яке ім’я, яке ви дали класу, укладене в лапки. Це дозволяє уникнути необхідності видалення поточного класу та додавання іншого. Цей приклад jsFiddle показує повний робочий код.
Алан Уеллс

3
Для зміни класу HTML-елемента за допомогою onClick використовуйте цей код: <input type='button' onclick='addNewClass(this)' value='Create' /> і в розділі javascript: function addNewClass(elem){ elem.className="newClass";} Інтернет
Іман Бахрампар

@Triynko - посилання на w3schools змінилося, схоже на вересень 2012 року. Ось ця сторінка на Archive.org від 12 вересня / 2012: HTML клас Attribute-w3schools . Ось посилання на сторінку заміни на w3schools.com: HTML-клас Attribute-w3schools .
Кевін Феган

Відповіді:


3879

Сучасні методики HTML5 для зміни класів

Сучасні браузери додали classList, який надає методи, щоб полегшити маніпулювання класами, не потребуючи бібліотеки:

document.getElementById("MyElement").classList.add('MyClass');

document.getElementById("MyElement").classList.remove('MyClass');

if ( document.getElementById("MyElement").classList.contains('MyClass') )

document.getElementById("MyElement").classList.toggle('MyClass');

На жаль, вони не працюють в Internet Explorer до v10, хоча є прокладка , щоб додати підтримку для нього в IE8 і IE9, доступною від цієї сторінки . Це, однак, все більше підтримується .

Просте крос-браузерне рішення

Використовується стандартний спосіб вибору елемента в JavaScript, для document.getElementById("Id")чого використовуються наступні приклади - ви, звичайно, можете отримувати елементи іншими способами, а в правильній ситуації можете просто використовувати thisзамість цього - однак, деталізація цього питання не виходить за рамки відповіді.

Щоб змінити всі класи для елемента:

Щоб замінити всі існуючі класи одним або кількома новими класами, встановіть атрибут className:

document.getElementById("MyElement").className = "MyClass";

(Ви можете використовувати список з обмеженим пробілом, щоб застосувати кілька класів.)

Щоб додати додатковий клас до елемента:

Щоб додати клас до елемента, не видаляючи / не впливаючи на існуючі значення, додайте пробіл та нове ім'я класу, наприклад:

document.getElementById("MyElement").className += " MyClass";

Щоб видалити клас із елемента:

Щоб видалити один клас до елемента, не впливаючи на інші потенційні класи, потрібна проста заміна регулярного вираження:

document.getElementById("MyElement").className =
   document.getElementById("MyElement").className.replace
      ( /(?:^|\s)MyClass(?!\S)/g , '' )
/* Code wrapped for readability - above is all one statement */

Пояснення цього регулярного вираження:

(?:^|\s) # Match the start of the string, or any single whitespace character

MyClass  # The literal text for the classname to remove

(?!\S)   # Negative lookahead to verify the above is the whole classname
         # Ensures there is no non-space character following
         # (i.e. must be end of string or a space)

The gПрапор указует замінити на повторення по мірі необхідності, в разі , якщо ім'я класу було додано кілька разів.

Щоб перевірити, чи клас вже застосовується до елемента:

Той самий регулярний вираз, який використовується вище для видалення класу, також може використовуватися як перевірка того, чи існує певний клас:

if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )


Призначення цих дій для onclick подій:

Хоча можна писати JavaScript безпосередньо всередині атрибутів події HTML (наприклад, як onclick="this.className+=' MyClass'" ), це не рекомендується. Особливо для великих застосувань досягається більш рентабельний код шляхом відокремлення розмітки HTML від логіки взаємодії з JavaScript.

Першим кроком для досягнення цього є створення функції та виклик функції в атрибуті onclick, наприклад:

<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }
</script>
...
<button onclick="changeClass()">My Button</button>

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

Другий крок - переміщення події onclick з HTML і в JavaScript, наприклад, за допомогою addEventListener

<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }

    window.onload = function(){
        document.getElementById("MyElement").addEventListener( 'click', changeClass);
    }
</script>
...
<button id="MyElement">My Button</button>

(Зверніть увагу, що частина window.onload необхідна для того, щоб вміст цієї функції виконувався після завершення завантаження HTML - без цього MyElement може не існувати під час виклику коду JavaScript, тому ця рядок не вдасться.)


Рамки та бібліотеки JavaScript

Наведений вище код є у стандартному JavaScript, однак для спрощення загальних завдань, а також виправлення помилок та крайових випадків, про які ви не могли б подумати при написанні коду, використовувати або рамку, або бібліотеку.

Хоча деякі люди вважають зайвим додати рамку ~ 50 Кб для простої зміни класу, якщо ви виконуєте значну кількість роботи з JavaScript, або що-небудь, що може мати незвичну поведінку між веб-браузерами, варто задуматися.

(Дуже приблизно, бібліотека - це набір інструментів, призначених для конкретного завдання, в той час як рамки, як правило, містять кілька бібліотек і виконують повний набір обов'язків.)

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

(Зверніть увагу, що $тут об’єкт jQuery.)

Зміна класів за допомогою jQuery:

$('#MyElement').addClass('MyClass');

$('#MyElement').removeClass('MyClass');

if ( $('#MyElement').hasClass('MyClass') )

Крім того, jQuery надає ярлик для додавання класу, якщо він не застосовується, або видалення класу, який робить:

$('#MyElement').toggleClass('MyClass');


Призначення функції події клацання за допомогою jQuery:

$('#MyElement').click(changeClass);

або, не потребуючи ідентифікатора:

$(':button:contains(My Button)').click(changeClass);



105
Чудова відповідь Петро. Одне питання ... чому краще робити JQuery, ніж Javascript? JQuery чудовий, але якщо це все, що вам потрібно зробити - що виправдовує включення всієї бібліотеки JQuery замість кількох рядків JavaScript?
mattstuehler

23
@mattstuehler 1) фраза "краще ще х" часто означає "ще краще (можна) х". 2) Щоб дістатися до суті справи, jQuery призначений для допомоги в доступі до / дому DOM, і дуже часто, якщо вам потрібно робити подібні речі, коли вам доведеться робити це в усьому місці.
Баррі

31
Одна помилка з цим рішенням: Коли ви натискаєте на кнопку кілька разів, вона додасть клас "MyClass" до елемента кілька разів, а не перевіряє, чи він уже існує. Таким чином, ви можете отримати атрибут класу HTML, який виглядає приблизно так:class="button MyClass MyClass MyClass"
Web_Designer

35
Якщо ви намагаєтесь видалити клас "myClass" і у вас є клас "префікс-myClass", виписаний вище регекс для видалення класу залишить вам "префікс-" у вашому класіName: O
jinglesthula

16
Ого, три роки та 183 оновлень, і ніхто досі цього не помічав. Дякую jinglesthula, я виправив регулярний вираз, щоб він неправильно видалив частини імен класів. // Я здогадуюсь, це хороший приклад того, чому Framework (наприклад, jQuery) варто використовувати - такі помилки виявляються та виправляються раніше, і не потребують змін у звичайному коді.
Пітер Бауфтон

422

Ви також можете просто зробити:

document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');

І для перемикання класу (видаліть, якщо існує ще додайте його):

document.getElementById('id').classList.toggle('class');

63
Я вважаю, що це залежить від HTML5.
Джон

12
Вам знадобиться накладка Елі Грей classList.
ELLIOTTCABLE

15
Мережа розробників Mozilla заявляє, що вона, як правило, не працює в Internet Explorer менше 10 років. Я вважаю, що це твердження є правдивим у моєму тестуванні. Мабуть, для Internet Explorer 8-9 потрібна прокладка Eli Grey . На жаль, я не зміг його знайти на його сайті (навіть при пошуку). Шина доступна за посиланням Mozilla.
подвійнийJ


4
atow "classList" має часткову підтримку в IE10 +; відсутність підтримки Opera Mini; ще повна підтримка в інших стандартних браузерах: caniuse.com/#search=classlist
Нік Хамфрі

119

В одному зі своїх старих проектів, які не використовували jQuery, я створив наступні функції для додавання, видалення та перевірки, якщо елемент має клас:

function hasClass(ele, cls) {
    return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}
function addClass(ele, cls) {
    if (!hasClass(ele, cls)) ele.className += " " + cls;
}
function removeClass(ele, cls) {
    if (hasClass(ele, cls)) {
        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
        ele.className = ele.className.replace(reg, ' ');
    }
}

Так, наприклад, якщо я хочу onclickдодати якийсь клас до кнопки, я можу використовувати це:

<script type="text/javascript">
    function changeClass(btn, cls) {
        if(!hasClass(btn, cls)) {
            addClass(btn, cls);
        }
    }
</script>
...
<button onclick="changeClass(this, "someClass")">My Button</button>

Напевно точно було б краще використовувати jQuery.


8
Це чудово, коли ваш клієнт не дозволяє вам використовувати jQuery. (Тому що ви закінчуєте майже побудову власної бібліотеки.)
Майк

1
@Mike Якщо клієнт не дозволяє вам використовувати jQuery, чи не могли б ви просто перейти та відновити лише потрібні функції у власній бібліотеці?
kfrncs

5
@kfrncs Тому що мені зазвичай не потрібна така велика рамка. Для проекту, про який я думав, єдині необхідні мені функції були 3 функції класу (має, додає, видаляють) та функції cookie (має, додає, видаляє). Все інше було або звичайним, або споконвічно добре підтримуваним. Тож все разом тоді було лише 150 рядків до мінімізації, включаючи коментарі.
Майк

2
Чувак, його 4 години ранку і велике спасибі. Vanilla JS - це те, що ми використовуємо в моєму проекті, і це було рятівником життя.
LessQuesar

Це моє улюблене рішення для цього. Я використовую його всюди. Я вважаю, що це найелегантніший спосіб досягти додавання та видалення класів, коли ваш проект вже не має іншого способу зробити це.
WebWanderer

77

Ви можете використовувати node.classNameтак:

document.getElementById('foo').className = 'bar';

Це має працювати в IE5.5 і вище відповідно до PPK .


11
це перезаписає будь-які та всі інші класи на об’єкті ... тому це не так просто.
Ерік Себаста

51

Нічого собі, здивований, що тут так багато відповідей на надмірність ...

<div class="firstClass" onclick="this.className='secondClass'">

14
Я б сказав, ненав'язливий JavaScript - жахлива практика написання прикладу коду ...
Гейб

22
Я не погоджуюся, тому що я думаю, що приклад коду повинен слугувати хорошим прикладом.
thomasrutter

1
Хороший приклад повинен водночас навчити і розпалити уяву. Вона не повинна замінювати думку, а надихати її.
Ентоні Ратлідж

4
Інші відповіді не є надмірними, вони також зберігають наявні класи на елементі.
gcampbell

47

Використання чистого коду JavaScript:

function hasClass(ele, cls) {
    return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}

function addClass(ele, cls) {
    if (!this.hasClass(ele, cls)) ele.className += " " + cls;
}

function removeClass(ele, cls) {
    if (hasClass(ele, cls)) {
        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
        ele.className = ele.className.replace(reg, ' ');
    }
}

function replaceClass(ele, oldClass, newClass){
    if(hasClass(ele, oldClass)){
        removeClass(ele, oldClass);
        addClass(ele, newClass);
    }
    return;
}

function toggleClass(ele, cls1, cls2){
    if(hasClass(ele, cls1)){
        replaceClass(ele, cls1, cls2);
    }else if(hasClass(ele, cls2)){
        replaceClass(ele, cls2, cls1);
    }else{
        addClass(ele, cls1);
    }
}

33

Це працює для мене:

function setCSS(eleID) {
    var currTabElem = document.getElementById(eleID);

    currTabElem.setAttribute("class", "some_class_name");
    currTabElem.setAttribute("className", "some_class_name");
}

Відмінна відповідь! Залишилося додати: Встановіть для кожного імені класу CSS для селектора, щоб вказати стиль для групи елементів класу
Роман Полен.

Це працює для мене на FF, але коли я намагався використовувати el.className = "newStyle"; це не спрацювало, чому?
Лукаш 'Северіан' Грела

1
Ви можете використовувати el.setAttribute('class', newClass)або краще el.className = newClass. Але ні el.setAttribute('className', newClass).
Оріол

20

Ви також можете розширити об’єкт HTMLElement, щоб додати методи додавання, видалення, перемикання та перевірки класів ( gist ):

HTMLElement = typeof(HTMLElement) != 'undefiend' ? HTMLElement : Element;

HTMLElement.prototype.addClass = function(string) {
  if (!(string instanceof Array)) {
    string = string.split(' ');
  }
  for(var i = 0, len = string.length; i < len; ++i) {
    if (string[i] && !new RegExp('(\\s+|^)' + string[i] + '(\\s+|$)').test(this.className)) {
      this.className = this.className.trim() + ' ' + string[i];
    }
  }
}

HTMLElement.prototype.removeClass = function(string) {
  if (!(string instanceof Array)) {
    string = string.split(' ');
  }
  for(var i = 0, len = string.length; i < len; ++i) {
    this.className = this.className.replace(new RegExp('(\\s+|^)' + string[i] + '(\\s+|$)'), ' ').trim();
  }
}

HTMLElement.prototype.toggleClass = function(string) {
  if (string) {
    if (new RegExp('(\\s+|^)' + string + '(\\s+|$)').test(this.className)) {
      this.className = this.className.replace(new RegExp('(\\s+|^)' + string + '(\\s+|$)'), ' ').trim();
    } else {
      this.className = this.className.trim() + ' ' + string;
    }
  }
}

HTMLElement.prototype.hasClass = function(string) {
  return string && new RegExp('(\\s+|^)' + string + '(\\s+|$)').test(this.className);
}

А потім просто використовуйте так (при натисканні додасть або видалить клас):

document.getElementById('yourElementId').onclick = function() {
  this.toggleClass('active');
}

Ось демонстрація .


1
це трохи детально ... ось дуже вдале
zero_cool

5
Вибачте @Jackson_Sandland, але ви зовсім пропустили суть, що зовсім не використовувати jQuery.
moka

17

Просто для додання інформації з іншого популярного фреймворку, Google Closures, дивіться їх клас дому / класи :

goog.dom.classes.add(element, var_args)

goog.dom.classes.addRemove(element, classesToRemove, classesToAdd)

goog.dom.classes.remove(element, var_args)

Один варіант вибору елемента - використання goog.dom.query із селектором CSS3:

var myElement = goog.dom.query("#MyElement")[0];

14

Кілька другорядних приміток і перетворень на попередніх регулярних виразках:

Ви хочете зробити це в усьому світі, якщо список класів має назву класу не один раз. І, ймовірно, ви захочете зняти пробіли з кінців списку класів і перетворити кілька пробілів в один простір, щоб уникнути запуску пробілів. Жодне з цих речей не повинно бути проблемою, якщо єдиний код, який діє з іменами класу, використовує регулярний вираз і видаляє ім'я перед його додаванням. Але. Ну, хто знає, хто може закусити зі списком назв класів.

Цей регулярний вираз нечутливий до регістру, тому помилки в іменах класів можуть з'являтися до того, як код буде використаний у браузері, який не стосується регістру в іменах класів.

var s = "testing   one   four  one  two";
var cls = "one";
var rg          = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "test";
var rg          = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "testing";
var rg          = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "tWo";
var rg          = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");

13

Змініть клас CSS елемента за допомогою JavaScript в ASP.NET :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        lbSave.Attributes.Add("onmouseover", "this.className = 'LinkButtonStyle1'")
        lbSave.Attributes.Add("onmouseout", "this.className = 'LinkButtonStyle'")
        lbCancel.Attributes.Add("onmouseover", "this.className = 'LinkButtonStyle1'")
        lbCancel.Attributes.Add("onmouseout", "this.className = 'LinkButtonStyle'")
    End If
End Sub

13

Я б використав jQuery і написати щось подібне:

jQuery(function($) {
    $("#some-element").click(function() {
        $(this).toggleClass("clicked");
    });
});

Цей код додає функцію , яка буде викликана , коли елемент ід деякі-елемент клацають. Функція додає клацнувши атрибут класу елемента, якщо він вже не є його частиною, і видаляє його, якщо він є.

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

Дякую


8
Вам потрібно писати лише jQueryв її довгій формі. jQuery(function($) { });робить $доступним всередині функції у всіх випадках.
ThiefMaster

10

Лінія

document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace(/\bMyClass\b/','')

має бути:

document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace('/\bMyClass\b/','');

8
Неправильно. RegEx розмежовується прямими нахилами. Додавання лапок призводить до невдачі в IE, повернення рядка класу, який ви намагаєтесь видалити, а не насправді видалення класу.
Ділан

9

Змініть клас елемента у ванільному JavaScript за допомогою підтримки IE6

Ви можете спробувати використовувати attributesвластивість вузла, щоб зберегти сумісність зі старими браузерами навіть IE6:

function getClassNode(element) {
  for (var i = element.attributes.length; i--;)
    if (element.attributes[i].nodeName === 'class')
      return element.attributes[i];
}

function removeClass(classNode, className) {
  var index, classList = classNode.value.split(' ');
  if ((index = classList.indexOf(className)) > -1) {
    classList.splice(index, 1);
    classNode.value = classList.join(' ');
  }
}

function hasClass(classNode, className) {
  return classNode.value.indexOf(className) > -1;
}

function addClass(classNode, className) {
  if (!hasClass(classNode, className))
    classNode.value += ' ' + className;
}

document.getElementById('message').addEventListener('click', function() {
  var classNode = getClassNode(this);
  var className = hasClass(classNode, 'red') && 'blue' || 'red';

  removeClass(classNode, 'red');
  removeClass(classNode, 'blue');

  addClass(classNode, className);
})
.red {
  color: red;
}
.red:before {
  content: 'I am red! ';
}
.red:after {
  content: ' again';
}
.blue {
  color: blue;
}
.blue:before {
  content: 'I am blue! '
}
<span id="message" class="">Click me</span>


8

Ось моя версія, повністю працює:

function addHTMLClass(item, classname) {
    var obj = item
    if (typeof item=="string") {
        obj = document.getElementById(item)
    }
    obj.className += " " + classname
}

function removeHTMLClass(item, classname) {
    var obj = item
    if (typeof item=="string") {
        obj = document.getElementById(item)
    }
    var classes = ""+obj.className
    while (classes.indexOf(classname)>-1) {
        classes = classes.replace (classname, "")
    }
    obj.className = classes
}

Використання:

<tr onmouseover='addHTMLClass(this,"clsSelected")'
onmouseout='removeHTMLClass(this,"clsSelected")' >

4
Це порушить клас, foobarякщо ви спробуєте видалити клас foo. Перед редагуванням JS в атрибутах обробника внутрішніх подій було зламано. 4-річна прийнята відповідь набагато краща.
Квентін

1
дякую, я виправив це (не проблема з префіксом). це стара прийнята відповідь, що має помилку з регулярним виразом.
Альфред

У коді все ще є foobarпроблема. Дивіться тест тут
rosell.dk

8

Ось toggleClass для перемикання / додавання / видалення класу для елемента:

// If newState is provided add/remove theClass accordingly, otherwise toggle theClass
function toggleClass(elem, theClass, newState) {
    var matchRegExp = new RegExp('(?:^|\\s)' + theClass + '(?!\\S)', 'g');
    var add=(arguments.length>2 ? newState : (elem.className.match(matchRegExp) == null));

    elem.className=elem.className.replace(matchRegExp, ''); // clear all
    if (add) elem.className += ' ' + theClass;
}

подивитися jsfiddle

також дивіться мою відповідь тут, щоб динамічно створити новий клас


6

У своєму коді я використовую такі функції JavaScript ванілі. Вони використовують регулярні вирази, indexOfале не вимагають цитування спеціальних символів у регулярних виразах.

function addClass(el, cn) {
    var c0 = (" " + el.className + " ").replace(/\s+/g, " "),
        c1 = (" " + cn + " ").replace(/\s+/g, " ");
    if (c0.indexOf(c1) < 0) {
        el.className = (c0 + c1).replace(/\s+/g, " ").replace(/^ | $/g, "");
    }
}

function delClass(el, cn) {
    var c0 = (" " + el.className + " ").replace(/\s+/g, " "),
        c1 = (" " + cn + " ").replace(/\s+/g, " ");
    if (c0.indexOf(c1) >= 0) {
        el.className = c0.replace(c1, " ").replace(/\s+/g, " ").replace(/^ | $/g, "");
    }
}

Ви також можете використовувати element.classList в сучасних браузерах.


3

ВАРІАНТИ.

Ось невеликий приклад стилю та classList, який допоможе вам побачити, які варіанти є у вас і як використовувати, classListщоб робити те, що ви хочете.

style vs. classList

Різниця між styleі в classListтому , що з styleви додаєте у властивостях стилю елемента, але classListце свого роду контроль клас (и) елемента ( add, remove,toggle , contain), я покажу вам , як використовувати addі removeметод , так як ті популярні.


Приклад стилю

Якщо ви хочете додати margin-top властивість до елемента, ви зробите таке:

// Get the Element
const el = document.querySelector('#element');

// Add CSS property 
el.style.margintop = "0px"
el.style.margintop = "25px" // This would add a 25px to the top of the element.

Приклад класного списку

Пусть говорят , що ми маємо <div class="class-a class-b">в даному випадку ми маємо 2 класу доданий в наш сну елемента вже, class-aі class-b, і ми хочемо контролювати , які класи removeі що клас дляadd . Тут classListстає зручно.

Видалити class-b

// Get the Element
const el = document.querySelector('#element');

// Remove class-b style from the element
el.classList.remove("class-b")

Додайте class-c

// Get the Element
const el = document.querySelector('#element');

// Add class-b style from the element
el.classList.add("class-c")


1

Просто думав, що я кину це:

function inArray(val, ary){
  for(var i=0,l=ary.length; i<l; i++){
    if(ary[i] === val){
      return true;
    }
  }
  return false;
}
function removeClassName(classNameS, fromElement){
  var x = classNameS.split(/\s/), s = fromElement.className.split(/\s/), r = [];
  for(var i=0,l=s.length; i<l; i++){
    if(!iA(s[i], x))r.push(s[i]);
  }
  fromElement.className = r.join(' ');
}
function addClassName(classNameS, toElement){
  var s = toElement.className.split(/\s/);
  s.push(c); toElement.className = s.join(' ');
}

1

просто скажіть, myElement.classList="new-class"якщо вам не потрібно підтримувати інші існуючі класи, в цьому випадку ви можете використовувати classList.add, .removeметоди.

var doc = document;
var divOne = doc.getElementById("one");
var goButton = doc.getElementById("go");

goButton.addEventListener("click", function() {
  divOne.classList="blue";
});
div{
  min-height:48px;
  min-width:48px;
}
.bordered{
  border: 1px solid black;
}
.green{
  background:green;
}
.blue{
  background: blue;
}
<button id="go">Change Class</button>

<div id="one" class="bordered green">

</div>


1

Гаразд, я думаю, що в цьому випадку ви повинні використовувати jQuery або писати свої власні Методи в чистому javascript, я вважаю за краще додавати свої власні методи, а не вводити всі jQuery у свою програму, якщо мені це не потрібно з інших причин.

Я хотів би зробити щось на кшталт нижче як методи до моєї програми javascript, щоб додати декілька функціональних можливостей, які обробляють додавання класів, видалення класів тощо, подібне до jQuery, це повністю підтримується в IE9 +, також мій код написаний в ES6, тому вам потрібно щоб переконатися, що ваш веб-переглядач підтримує його або ви використовуєте щось на зразок babel, інакше потрібно використовувати синтаксис ES5 у своєму коді, також таким чином ми знаходимо елемент через ідентифікатор, а це означає, що елементу потрібно вибрати ідентифікатор:

//simple javascript utils for class management in ES6
var classUtil = {

  addClass: (id, cl) => {
    document.getElementById(id).classList.add(cl);
  },

  removeClass: (id, cl) => {
    document.getElementById(id).classList.remove(cl);
  },

  hasClass: (id, cl) => {
    return document.getElementById(id).classList.contains(cl);
  },

  toggleClass: (id, cl) => {
    document.getElementById(id).classList.toggle(cl);
  }

}

і ви можете просто зателефонувати використовувати їх як нижче, уявіть, що ваш елемент має ідентифікатор 'id' та клас 'class', переконайтеся, що ви передаєте їх як рядок, ви можете використовувати утиліту, як показано нижче:

classUtil.addClass('myId', 'myClass');
classUtil.removeClass('myId', 'myClass');
classUtil.hasClass('myId', 'myClass');
classUtil.toggleClass('myId', 'myClass');

1

classList DOM API:

Дуже зручним способом додавання та видалення класів є classListAPI DOM. Цей API дозволяє нам вибирати всі класи певного елемента DOM з метою зміни списку за допомогою javascript. Наприклад:

const el = document.getElementById("main");
console.log(el.classList);
<div class="content wrapper animated" id="main"></div>

У журналі можна спостерігати, що ми повертаємо об’єкт із не лише класами елемента, а й багатьма допоміжними методами та властивостями. Цей об'єкт успадковується від інтерфейсу DOMTokenList - інтерфейс, який використовується в DOM для представлення набору токенів, розділених простором (як класи).

Приклад:

const el = document.getElementById('container');


function addClass () {
   el.classList.add('newclass');
}


function replaceClass () {
     el.classList.replace('foo', 'newFoo');
}


function removeClass () {
       el.classList.remove('bar');
}
button{
  margin: 20px;
}

.foo{
  color: red;
}

.newFoo {
  color: blue;
}

.bar{
  background-color:powderblue;
}

.newclass{
  border: 2px solid green;
}
<div class="foo bar" id="container">
  "Sed ut perspiciatis unde omnis 
  iste natus error sit voluptatem accusantium doloremque laudantium, 
  totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et 
  quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam 
  voluptatem quia voluptas 
 </div>
  
<button onclick="addClass()">AddClass</button>
  
<button onclick="replaceClass()">ReplaceClass</button>
  
<button onclick="removeClass()">removeClass</button>
  


1

Так, існує багато способів зробити це. У синтаксисі ES6 ми можемо досягти легко. За допомогою цього коду перемикайте клас додавання та видалення.

const tabs=document.querySelectorAll('.menu li');

for(let tab of tabs){
  
  tab.onclick=function(){
    
  let activetab=document.querySelectorAll('li.active');
    
  activetab[0].classList.remove('active')
  
    tab.classList.add('active'); 
  }
  
}
body {
    padding:20px;
    font-family:sans-serif;    
}

ul {
    margin:20px 0;
    list-style:none;
}

li {
    background:#dfdfdf;
    padding:10px;
    margin:6px 0;
    cursor:pointer;
}

li.active {
    background:#2794c7;
    font-weight:bold;
    color:#ffffff;
}
<i>Please click an item:</i>

<ul class="menu">
  <li class="active"><span>Three</span></li>
  <li><span>Two</span></li>
  <li><span>One</span></li>
</ul>


1
function classed(el, class_name, add_class) {
  const re = new RegExp("(?:^|\\s)" + class_name + "(?!\\S)", "g");
  if (add_class && !el.className.match(re)) el.className += " " + class_name
  else if (!add_class) el.className = el.className.replace(re, '');
}

Використання прийнятої відповіді вище тут є простою функцією крос-браузера для додавання та видалення класу

додати клас:

classed(document.getElementById("denis"), "active", true)

видалити клас:

classed(document.getElementById("denis"), "active", false)

1

Багато відповідей, багато хороших відповідей.

TL; DR:

document.getElementById('id').className = 'class'

АБО

document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');

Це воно.

І, якщо ви дійсно хочете знати, чому і вчите себе, тоді я пропоную прочитати відповідь Пітера Баутона , це ідеально.

Примітка.
Це можливо за допомогою ( документа чи події ):

  • getElementById()
  • getElementsByClassName()
  • querySelector()
  • querySelectorAll()

1

У javascript є властивість className для зміни імені класу HTML-елемента. Існуюче значення класу буде замінено новим, яке ви призначили у className.

<!DOCTYPE html>
<html>
<head>
<title>How to change class of an HTML element in Javascript?</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<h1 align="center"><i class="fa fa-home" id="icon"></i></h1><br />

<center><button id="change-class">Change Class</button></center>

<script>
var change_class=document.getElementById("change-class");
change_class.onclick=function()
{
    var icon=document.getElementById("icon");
    icon.className="fa fa-gear";
}

</script>
</body>
</html>

Кредит - https://jaischool.com/javascript-lang/how-to-change-class-name-of-an-html-element-in-javascript.html


1

Питання ОП було: Як я можу змінити клас елемента за допомогою JavaScript?

Сучасні браузери дозволяють робити це за допомогою одного рядка javascript :

document.getElementById('id').classList.replace('span1','span2')

classListАтрибут забезпечує DOMTokenList , який має різні методи . Ви можете керувати елементом classList елемента, використовуючи прості маніпуляції, такі як add () , remove () або substitution () . Або отримуйте дуже складні та маніпулюйте класами, як ви об'єкт або Map за допомогою клавіш () , значень () , entries ()

Відповідь Пітера Бауфтона - чудова, але це вже більше десяти років. Усі сучасні браузери тепер підтримують DOMTokenList - див. Https://caniuse.com/#search=classList і навіть IE11 підтримує деякі методи DOMTokenList



-2

Робочий код JavaScript:

<div id="div_add" class="div_add">Add class from Javascript</div>
<div id="div_replace" class="div_replace">Replace class from Javascript</div>
<div id="div_remove" class="div_remove">Remove class from Javascript</div>
<button onClick="div_add_class();">Add class from Javascript</button>
<button onClick="div_replace_class();">Replace class from Javascript</button>
<button onClick="div_remove_class();">Remove class from Javascript</button>
<script type="text/javascript">
    function div_add_class()
    {
        document.getElementById("div_add").className += " div_added";
    }
    function div_replace_class()
    {
        document.getElementById("div_replace").className = "div_replaced";
    }
    function div_remove_class()
    {
        document.getElementById("div_remove").className = "";
    }
</script>

Ви можете завантажити робочий код за цим посиланням .


1
Це порушить елементи з більш ніж одним класом.
gcampbell

-4

Ось простий код jQuery для цього.

$(".class1").click(function(argument) {
    $(".parentclass").removeClass("classtoremove");
    setTimeout(function (argument) {
        $(".parentclass").addClass("classtoadd");
    }, 100);
});

Ось

  • Class1 - слухач події.
  • Батьківський клас - це клас, в якому розміщується клас, який ви хочете змінити
  • Classtoremove - це старий клас у вас.
  • Клас для додавання - це новий клас, який ви хочете додати.
  • 100 - час затримки, протягом якого змінюється клас.

Щасти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.