Як додати клас до заданого елемента?


1186

У мене є елемент, у якого вже є клас:

<div class="someclass">
    <img ... id="image1" name="image1" />
</div>

Тепер я хочу створити функцію JavaScript, яка додасть клас до div(не замінює, а додає).

Як я можу це зробити?


9
Для тих, хто читає цю тему в 2020 році або пізніше, пропустіть старий метод className і використовуйте element.classList.add("my-class")натомість.
Pikamander2

Відповіді:


1918

Якщо ви орієнтуєтесь лише на сучасні веб-переглядачі:

Використовуйте element.classList.add, щоб додати клас:

element.classList.add("my-class");

І element.classList.remove для видалення класу:

element.classList.remove("my-class");

Якщо вам потрібно підтримати Internet Explorer 9 або новішої версії:

Додайте пробіл плюс ім'я вашого нового класу у classNameвластивість елемента. Спочатку надіньте idелемент, щоб ви могли легко отримати посилання.

<div id="div1" class="someclass">
    <img ... id="image1" name="image1" />
</div>

Тоді

var d = document.getElementById("div1");
d.className += " otherclass";

Зверніть увагу на пробіл раніше otherclass. Важливо включити простір, інакше воно компрометує існуючі класи, що знаходяться перед ним, у списку класів.

Дивіться також element.className на MDN .


26
Якщо єдиною роботою на всій сторінці, яку потрібно виконати за допомогою JavaScript, є додавання цього імені класу, то так. Але я не можу побачити, що це єдина динамічна частина сторінки. Бібліотека допоможе і з усім іншим. При 30-50 кб jQuery навряд чи є хітом, про який варто обговорити.
rfunduk

167
«Бібліотека допоможе з усім іншим, а" - крім навчання JavaScript
meouw

19
Що стосується додавання класу до елемента DOM, пов'язаного з вивченням мови? document.getElementById ('div1'). className - це стільки ж проблем, пов’язаних із бібліотекою, як і використання jQuery. Питання було "як я можу це зробити", ретельно перевірена бібліотека - це розумна відповідь.
rfunduk

6
@thenduks: Я впевнений, що ви знаєте, що JavaScript! == jQuery. Добре, що відповіді на це питання містять бібліотечні та небібліотечні рішення, оскільки важливо знати, як все працює не просто найпростішим способом їх виконання. Ви помітите, що це запитання позначено тегами
javas

2
@meouw: Я згоден з тобою. jQuery написаний на JavaScript, тому я стверджую, що згадування ОП про те, що бібліотека є гарною ідеєю, не є "проштовхуванням рамки [горло] вниз". Це все.
rfunduk

1350

Найпростіший спосіб зробити це без будь-яких фреймворків - це використовувати метод element.classList.add .

var element = document.getElementById("div1");
element.classList.add("otherclass");

Редагувати. І якщо ви хочете видалити клас з елемента -

element.classList.remove("otherclass");

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


67
Прикро, що це не підтримується до IE 10.0, оскільки це відмінна функція та найпростіше рішення проблеми, з якою я часто зустрічаюся.
mricci

12
Доступний полів для classList.
wcandillon


11
Цей, здається, найкращий у використанні, оскільки ті, хто має простір, принаймні відчувають себе хакерами - не
ментант

5
@SilverRingvee Наступним ризиком космічного підходу є те, що інший розробник може не знати, що це життєво важливо, і видалити його, щоб очистити речі.
akauppi

178

знайдіть свій цільовий елемент "d", як тільки ви хочете, а потім:

d.className += ' additionalClass'; //note the space

Ви можете це зрозуміти розумнішими способами, щоб перевірити існування та перевірити, чи потрібні місця тощо.


А видалити за допомогою цього методу?
DeathGrip

3
@DeathGrip просто повертає клас назад до одного визначеного імені d.className = 'originalClass';
TheTechy

@TheTechy - якщо у вас є більше одного класу, який вам потрібно тримати (що трапляється дуже багато цих днів), це не спрацює.
Марк

1
Щоб видалити старомодний спосіб, splitім'я класу з пробілів, видаліть той, який ви не хочете, з отриманого масиву, потім joinзнову масив ... або скористайтеся element.classList.remove.
Штійн де Вітт

131

Додати клас

  • Хрест сумісний

    У наступному прикладі ми додамо classnameдо <body>елементу. Це сумісний з IE-8.

    var a = document.body;
    a.classList ? a.classList.add('classname') : a.className += ' classname';

    Це скорочення для наступного ..

    var a = document.body;
    if (a.classList) {
        a.classList.add('wait');
    } else {
        a.className += ' wait';
    }

  • Продуктивність

    Якщо ви більше переймаєтесь ефективністю над перехресною сумісністю, ви можете скоротити її до наступного, що на 4% швидше.

    var z = document.body;
    document.body.classList.add('wait');

  • Зручність

    Крім того, ви можете використовувати jQuery, але результат у результаті значно повільніший. На 94% повільніше відповідно до jsPerf

    $('body').addClass('wait');


Видалення класу

  • Продуктивність

    Вибіркове використання jQuery - це найкращий метод видалення класу, якщо вас цікавить ефективність

    var a = document.body, c = ' classname';
    $(a).removeClass(c);

  • Без jQuery це на 32% повільніше

    var a = document.body, c = ' classname';
    a.className = a.className.replace( c, '' );
    a.className = a.className + c;

Список літератури

  1. Тест jsPerf: Додавання класу
  2. Тест jsPerf: Видалення класу

Використання прототипу

Element("document.body").ClassNames.add("classname")
Element("document.body").ClassNames.remove("classname")
Element("document.body").ClassNames.set("classname")

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

YAHOO.util.Dom.hasClass(document.body,"classname")
YAHOO.util.Dom.addClass(document.body,"classname")
YAHOO.util.Dom.removeClass(document.body,"classname")

О, дякую :) Чи буде скорочена версія ( a.classList ? ...) мати різницю швидкості порівняно із звичайною ( if (a.classList) { ....)?
Вільф

5
Там також classList.remove(). Чому ти його не використав? це набагато швидше, ніж jQuery jsperf.com/remove-class-vanilla-vs-jquery
Fez Vrasta

@FezVrasta classList не підтримується до IE 10, який все ще має гідну частку ринку (+ 13% на netmarketshare.com).
Адам,

6
@Adam він використовував classListдля всього, крім видалення класів, ось чому я це прошу.
Фес Враста

@FezVrasta Під крос-сумісним я використовував .add (), але лише перевіривши, чи є в наявності, хенес- сумісний хрест . Для видалення я не намагався повторити себе, тому не включив стільки варіантів.
davidcondrey

33

Інший підхід для додавання класу до елемента за допомогою чистого JavaScript

Для додавання класу:

document.getElementById("div1").classList.add("classToBeAdded");

Для видалення класу:

document.getElementById("div1").classList.remove("classToBeRemoved");

4
На це вже кілька разів відповідали інші користувачі, включаючи обговорення підтримки веб-переглядача та лайків.
bafromca

@bafromca Я не бачив попередньої відповіді, і це моя помилка. Ви можете позначити цю відповідь
Shoaib Chikate

3
@ShoaibChikate: ви також можете видалити відповідь, якщо хочете (ви збережете бали). Просто намагаюся зменшити безлад у цьому питанні; повністю залежить від вас.
Дан Даскалеску

22

Коли робота, яку я виконую, не вимагає використання бібліотеки, я використовую ці дві функції:

function addClass( classname, element ) {
    var cn = element.className;
    //test for existance
    if( cn.indexOf( classname ) != -1 ) {
        return;
    }
    //add a space if the element already has class
    if( cn != '' ) {
        classname = ' '+classname;
    }
    element.className = cn+classname;
}

function removeClass( classname, element ) {
    var cn = element.className;
    var rxp = new RegExp( "\\s?\\b"+classname+"\\b", "g" );
    cn = cn.replace( rxp, '' );
    element.className = cn;
}

15
if( cn.indexOf( classname ) != -1 ) { return; } Будьте уважні, якщо ви додасте клас "btn", коли клас "btn-info" вже є, це не вдасться.
Олександр Дієло

1
ви повинні використовувати element.className.split(" ");для запобігання проблеми @AlexandreDieulot, про що тут повідомляється.
Амір Фо

20

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

Це зробить майже все, що вам потрібно буде зробити (включаючи це) дуже просто.

Отже, скажімо, у вас зараз jQuery на своїй сторінці, ви можете використовувати такий код, щоб додати ім'я класу до елемента (для завантаження в цьому випадку):

$(document).ready( function() {
  $('#div1').addClass( 'some_other_class' );
} );

Перегляньте веб-переглядач jQuery API щодо інших речей.


15

Для додавання / видалення класу з елемента можна використовувати метод classList.add АБО classList.remove.

var nameElem = document.getElementById("name")
nameElem.classList.add("anyclss")

Вищевказаний код додасть (і НЕ замінить) клас "anyclass" до nameElem. Аналогічно ви можете використовувати метод classList.remove () для видалення класу.

nameElem.classList.remove("anyclss")

дуже приємно, але не підтримується в IE <= 9 або Safari <= 5.0 ... :( ( caniuse.com/classlist )
simon

1
Про це вже йшлося , включаючи підтримку браузера.
Дан Даскалеску

10

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

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

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

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

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

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

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


6

Якщо ви не хочете використовувати jQuery і хочете підтримувати старіші веб-переглядачі:

function addClass(elem, clazz) {
    if (!elemHasClass(elem, clazz)) {
        elem.className += " " + clazz;
    }
}

function elemHasClass(elem, clazz) {
    return new RegExp("( |^)" + clazz + "( |$)").test(elem.className);
}

5

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

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

function addClass(element,className){
  var classArray = className.split(' ');
  classArray.forEach(function (className) {
    if(!hasClass(element,className)){
      element.className += " "+className;
    }
  });            
}
//this will add 5 only once
addClass(document.querySelector('#getbyid'),'3 4 5 5 5');

5

Я теж вважаю, що найшвидший спосіб - це використовувати Element.prototype.classList, як в es5: document.querySelector(".my.super-class").classList.add('new-class') але в ie8 немає такого поняття, як Element.prototype.classList, все одно ви можете поліфікувати його цим фрагментом (ви можете безкоштовно редагувати та вдосконалювати його ):

if(Element.prototype.classList === void 0){
	function DOMTokenList(classes, self){
		typeof classes == "string" && (classes = classes.split(' '))
		while(this.length){
			Array.prototype.pop.apply(this);
		}
		Array.prototype.push.apply(this, classes);
		this.__self__ = this.__self__ || self
	}

	DOMTokenList.prototype.item = function (index){
		return this[index];
	}

	DOMTokenList.prototype.contains = function (myClass){
		for(var i = this.length - 1; i >= 0 ; i--){
			if(this[i] === myClass){
				return true;
			}
		}
		return false
	}

	DOMTokenList.prototype.add = function (newClass){
		if(this.contains(newClass)){
			return;
		}
		this.__self__.className += (this.__self__.className?" ":"")+newClass;
		DOMTokenList.call(this, this.__self__.className)
	}

	DOMTokenList.prototype.remove = function (oldClass){
		if(!this.contains(newClass)){
			return;
		}
		this[this.indexOf(oldClass)] = undefined
		this.__self__.className = this.join(' ').replace(/  +/, ' ')
		DOMTokenList.call(this, this.__self__.className)
	}

	DOMTokenList.prototype.toggle = function (aClass){
		this[this.contains(aClass)? 'remove' : 'add'](aClass)
		return this.contains(aClass);
	}

	DOMTokenList.prototype.replace = function (oldClass, newClass){
		this.contains(oldClass) && this.remove(oldClass) && this.add(newClass)
	}

	Object.defineProperty(Element.prototype, 'classList', {
		get: function() {
			return new DOMTokenList( this.className, this );
		},
		enumerable: false
	})
}


4

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

<div class="someClass otherClass yetAnotherClass">
      <img ... id="image1" name="image1" />
</div>

Звідти ви можете легко отримати javascript, необхідний для додавання нового класу ... просто додайте пробіл, а потім новий клас, до властивості className елемента. Знаючи це, ви також можете написати функцію для видалення класу пізніше, якщо виникне потреба.


4

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

var uclass = {
    exists: function(elem,className){var p = new RegExp('(^| )'+className+'( |$)');return (elem.className && elem.className.match(p));},
    add: function(elem,className){if(uclass.exists(elem,className)){return true;}elem.className += ' '+className;},
    remove: function(elem,className){var c = elem.className;var p = new RegExp('(^| )'+className+'( |$)');c = c.replace(p,' ').replace(/  /g,' ');elem.className = c;}
};

var elem = document.getElementById('someElem');
//Add a class, only if not exists yet.
uclass.add(elem,'someClass');
//Remove class
uclass.remove(elem,'someClass');

4

Ви можете використовувати сучасний підхід, подібний до jQuery

Якщо вам потрібно змінити лише один елемент, перший, який JS знайде в DOM, ви можете скористатися цим:

document.querySelector('.someclass').className += " red";
.red {
  color: red;
}
<div class="someclass">
  <p>This method will add class "red" only to first element in DOM</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

Майте на увазі, щоб залишити один простір раніше назвою класу.

Якщо у вас є кілька класів, де ви хочете додати новий клас, ви можете використовувати його так

document.querySelectorAll('.someclass').forEach(function(element) {
  element.className += " red";
});
.red {
  color: red;
}
<div class="someclass">
  <p>This method will add class "red" to all elements in DOM that have "someclass" class.</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>


3

Я думаю, що краще використовувати чистий JavaScript, який ми можемо запустити в DOM браузера.

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

'use strict'

const oldAdd = (element, className) => {
  let classes = element.className.split(' ')
  if (classes.indexOf(className) < 0) {
    classes.push(className)
  }
  element.className = classes.join(' ')
}

const oldRemove = (element, className) => {
  let classes = element.className.split(' ')
  const idx = classes.indexOf(className)
  if (idx > -1) {
    classes.splice(idx, 1)
  }
  element.className = classes.join(' ')
}

const addClass = (element, className) => {
  if (element.classList) {
    element.classList.add(className)
  } else {
    oldAdd(element, className)
  }
}

const removeClass = (element, className) => {
  if (element.classList) {
    element.classList.remove(className)
  } else {
    oldRemove(element, className)
  }
}


2

Проба з чистою JS. У першому прикладі ми отримуємо ідентифікатор нашого елемента і додаємо, наприклад, 2 класи.

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsById('tabGroup').className = "anyClass1 anyClass2";
})

У другому прикладі ми отримуємо ім'я класу елемента та додаємо ще 1.

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsByClassName('tabGroup')[0].className = "tabGroup ready";
})

1

Для тих, хто використовує Lodash та хочуть оновити classNameрядок:

// get element reference
var elem = document.getElementById('myElement');

// add some classes. Eg. 'nav' and 'nav header'
elem.className = _.chain(elem.className).split(/[\s]+/).union(['nav','navHeader']).join(' ').value()

// remove the added classes
elem.className = _.chain(elem.className).split(/[\s]+/).difference(['nav','navHeader']).join(' ').value()

0

спочатку дайте діві ідентифікатор. Потім виклик функції appendClass:

<script language="javascript">
  function appendClass(elementId, classToAppend){
    var oldClass = document.getElementById(elementId).getAttribute("class");
    if (oldClass.indexOf(classToAdd) == -1)
    {
      document.getElementById(elementId).setAttribute("class", classToAppend);
    }
}
</script>

1
він замінить клас не додавати! Можливо, у рядку відсутня або старий клас + "" + classToAppend замість останнього classToAppend
Vinze

indexOfє наївним рішенням і має вже вказану проблему .
Дан Даскалеску

0

Ви можете використовувати API querySelector, щоб вибрати свій елемент, а потім створити функцію з елементом та новим іменем класу як параметри. Використання списку класів для сучасних браузерів, інакше для IE8. Потім ви можете викликати функцію після події.

 //select the dom element
 var addClassVar = document.querySelector('.someclass');

 //define the addclass function
 var addClass = function(el,className){
   if (el.classList){
     el.classList.add(className);
   }
   else {
     el.className += ' ' + className;
  }
};

//call the function
addClass(addClassVar, 'newClass');

Про це вже йшлося разом із підтримкою браузера.
Дан Даскалеску


0
document.getElementById('some_id').className+='  someclassname'

АБО:

document.getElementById('come_id').classList.add('someclassname')

Перший підхід допоміг додати клас, коли другий підхід не працював.
Не забудьте зберегти пробіл перед' someclassname'У першому підході .

Для видалення ви можете використовувати:

document.getElementById('some_id').classList.remove('someclassname')

-4

Цей js-код працює для мене

забезпечує заміну імені класу

var DDCdiv = hEle.getElementBy.....

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array
for (var i=0; i< Ta.length;i++)
{
    if (Ta[i] == 'visible'){
        Ta[i] = 'hidden';
        break;// quit for loop
    }
    else if (Ta[i] == 'hidden'){
        Ta[i] = 'visible';
    break;// quit for loop
    }
}
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

Щоб додати просто використовувати

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array
Ta.push('New class name');
// Ta.push('Another class name');//etc...
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

Щоб видалити використання

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array

for (var i=0; i< Ta.length;i++)
{
    if (Ta[i] == 'visible'){
        Ta.splice( i, 1 );
        break;// quit for loop
    }
}
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

Сподіваюся, це комусь корисно


-9

У YUI, якщо включити yuidom , ви можете використовувати

YAHOO.util.Dom.addClass('div1','className');

HTH


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