Как я могу изменить класс элемента с помощью JavaScript?

Как я могу изменить класс элемента HTML в ответ на onclick или любые другие события с помощью JavaScript?

«Атрибут class в основном используется для указания класса в таблице стилей. Однако он также может использоваться JavaScript (через HTML DOM) для внесения изменений в элементы HTML с указанным классом». -w3schools.com/tags/att_standard_class.asp

Triynko 07.04.2011 22:11

element.setAttribute(name, value); Замените name на class. Замените value на любое имя, которое вы дали классу, заключенное в кавычки. Это позволяет избежать необходимости удалять текущий класс и добавлять другой. Этот jsFiddle пример показывает полный рабочий код.

Alan Wells 18.05.2014 08:59

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

Iman Bahrampour 22.08.2017 07:13

@Triynko - эта ссылка на w3schools изменилась, похоже, в сентябре 2012 года. Вот эта страница на Archive.org от 12 сентября 2012 года: Атрибут HTML-класса-w3schools. Вот ссылка на заменяющую страницу на w3schools.com: Атрибут HTML-класса-w3schools.

Kevin Fegan 12.10.2018 20:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2 942
4
2 785 759
32
Перейти к ответу Данный вопрос помечен как решенный

Ответы 32

Проще всего это сделать с такой библиотекой, как jQuery:

<input type = "button" onClick = "javascript:test_byid();" value = "id='second'" />

<script>
function test_byid()
{
    $("#second").toggleClass("highlight");
}
</script>

Что делает псевдопротокол javascript: в событии сценария ... Кажется совершенно глупым говорить интерпретатору javascript, что он должен рассматривать сценарий в событии сценария как сценарий! -) Использование только псевдонима javascript: -protocol - это то место, где вы вместо этого использовали бы URL-адрес! o]

roenving 13.10.2008 00:20

В этом контексте это не псевдопротокол - это метка цикла ... только для нее нет цикла TO метки.

Quentin 13.10.2008 12:19

На самом деле это не псевдопротокол, он интерпретируется как метка JavaScript, например, то, что вы можете использовать в цикле. Можно было легко сделать onClick = "myScriptYo:do_it();". Но, пожалуйста, не делай этого.

kzh 09.03.2011 23:32

Без обид, но неразумно менять класс на лету, поскольку это заставляет интерпретатор CSS пересчитывать визуальное представление всей веб-страницы.

Причина в том, что интерпретатору CSS практически невозможно узнать, можно ли изменить какое-либо наследование или каскадирование, поэтому краткий ответ:

Никогда не меняйте className на лету! -)

Но обычно вам нужно изменить только одно или два свойства, и это легко реализуется:

function highlight(elm){
    elm.style.backgroundColor  = "#345";
    elm.style.color = "#fff";
}

Я никогда не испытывал проблем с производительностью при переключении классов CSS. Я думаю, какая бы производительность ни была там мощь, она намного перевешивается беспорядком из-за того, что стили / представление смешиваются в вашем javascript.

nickf 13.10.2008 00:46

Хм, очевидно, вы его никогда не тестировали ... В приложении реального времени, состоящем из тысяч строк, вложенных с другими элементами, я распознал задержку в несколько секунд, переделав ее только для изменения свойств, невозможно было распознать задержку ...

roenving 13.10.2008 00:51

Зачем вам даже нужны тысячи строк, вложенных с другими элементами? Кроме того, с какой операционной системой и браузером была задержка?

Peter Boughton 13.10.2008 01:49

Если изменение className вызывает заметные проблемы с производительностью, у вас гораздо большие проблемы со структурой и дизайном вашей страницы / приложения. В противном случае сокращение нескольких миллисекунд - не лучший повод засорять логику приложения стилями.

eyelidlessness 13.10.2008 07:33

это худшая идея на свете. смена классов - это, безусловно, самый простой и понятный способ обновить CSS «на лету».

Jason 09.12.2009 01:19

«Тысячи строк» ​​неверующим: докислород. Иерархические складные меню в боковой рамке. У IE7 были фатальные проблемы с этим, поэтому я использовал Firefox.

Erik Olson 24.06.2011 19:39

Мне интересно, почему вы еще не удалили свой ответ! (это 2016 год)

Alex Jolig 31.01.2016 22:00

@AlexJolig - пользователь не входил в систему с 2009 года

Krease 10.06.2016 19:47

Это второй по популярности ответ на сайте.

Mr Anderson 01.09.2016 23:01

Я думаю, что «вообще не делай этого» - неприемлемый ответ на вопрос «как это сделать».

Lajos Meszaros 18.04.2017 14:25

Поэтому вместо изменения класса вы пишете встроенные стили вручную. Вы беретесь за работу CSS. Кстати, если вы отредактируете атрибут стиля, он также перерисует страницу, как если бы вы изменили класс. "очевидно, вы никогда не проверяли это" - покажите нам некоторые точные данные о том, насколько ваше решение быстрее. И, пожалуйста, не сообщайте нам такие данные, как «На 40% быстрее, когда вы выполняете 20 миллионов изменений» или что-то в этом роде.

Lajos Meszaros 18.04.2017 14:32

Вы можете использовать node.className так:

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

Это должно работать в IE5.5 и выше в соответствии с PPK.

это перезапишет любые и все другие классы объекта ... так что это не так просто.

Eric Sebasta 09.10.2015 23:33
Ответ принят как подходящий

Современные методы 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 the end of the string or space)

Флаг g указывает замене на повторение по мере необходимости, если имя класса было добавлено несколько раз.

Чтобы проверить, применен ли уже класс к элементу:

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

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

### Assigning these actions to onclick events:

Хотя можно писать 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>

(It is not required to have this code in script tags, this is simply for the brevity of example, and including the JavaScript in a distinct file may be more appropriate.)

Второй шаг - переместить событие 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');

### Assigning a function to a click event with jQuery:
$('#MyElement').click(changeClass);

или без идентификатора:

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

Отличный ответ Петр. Один вопрос ... почему лучше имеет отношение к JQuery, а не к Javascript? JQuery великолепен, но если это все, что вам нужно сделать - что оправдывает включение всей библиотеки JQuery вместо нескольких строк JavaScript?

mattstuehler 15.05.2011 19:32

@mattstuehler 1) фраза «еще лучше x» довольно часто означает «еще лучше (вы можете) x». 2) Чтобы понять суть вопроса, jQuery разработан для помощи в доступе / управлении DOM, и очень часто, если вам нужно делать такие вещи, когда вам нужно делать это повсюду.

Barry 24.05.2011 20:46

Помните, что в случае добавления имени класса перед именем класса, которое вы хотите добавить, ДОЛЖНЫ быть пробелы.

didxga 13.07.2011 11:07

если вы добавляете класс, удаляется ли предыдущий класс, или вам придется делать это вручную?

Gabor Magyar 27.07.2011 23:22

Предыдущие занятия останутся. Вам придется вручную удалить другие классы, если вы хотите это сделать.

Micharch54 03.08.2011 23:15

Одна ошибка в этом решении: когда вы нажимаете кнопку несколько раз, он несколько раз добавляет к элементу класс «MyClass», а не проверяет, существует ли он уже. Таким образом, вы можете получить атрибут класса HTML, выглядящий примерно так: class = "button MyClass MyClass MyClass"

Web_Designer 13.09.2011 20:28

Я предполагаю, что решением будет: if ( ! document.getElementById("MyElement").className.match(/(?:^|\‌​s)MyClass(?!\S)/) ) или, с jQuery: if ( ! $j('#MyElement').hasClass('MyClass') ) (хотя я подозреваю, что addClass не будет добавлять дубликаты?)

Peter Boughton 14.09.2011 04:14

Если вы пытаетесь удалить класс myClass и у вас есть класс prefix-myClass, регулярное выражение, которое вы указали выше для удаления класса, оставит вас с prefix- в вашем className: O

jinglesthula 15.09.2011 09:26

Вау, три года и 183 положительных голоса, и до сих пор этого никто не заметил. Спасибо jinglesthula, я исправил регулярное выражение, чтобы оно не удаляло некорректно части имен классов. // Думаю, это хороший пример того, почему стоит использовать Framework (например, jQuery) - подобные ошибки обнаруживаются и исправляются раньше и не требуют изменений в обычном коде.

Peter Boughton 15.09.2011 21:09

Я сделал несколько незначительных правок, чтобы улучшить ответ - надеюсь, люди согласятся, что это улучшения? Если что-то еще я пропустил, дайте мне знать (или просто отредактируйте ответ самостоятельно).

Peter Boughton 15.09.2011 21:24

@PeterBoughton Не уверен, что это улучшение, но мне нравится: (' '+document.getElementById("MyElement").className+' ').replace( ' '+MyClass+' ' , '' )

Paul 21.12.2011 13:38

@ PaulP.R.O. вы сворачиваете окружающие пробелы и регулярное выражение до нуля, что объединяет строки имени окружающего класса (если таковые имеются) вместе. Я думаю, что elem.className = elem.className.replace ('' + classname + '', '') - это то, что мы хотим. Спасибо!

Cris Stringfellow 04.06.2012 14:40

Я использую аналогичные методы, но с регулярным выражением g (общим). причина именно в проблеме, описанной выше @Web_Designer: если пользователь нажимает несколько раз, вы получаете несколько экземпляров одного и того же класса, и все экземпляры должны быть удалены, чтобы удалить класс.

Christophe 15.08.2012 04:06

Импорт всей библиотеки для выполнения одной простой задачи - вот почему в Интернете так много накладных расходов. Поэтому я не согласен с тем, что использование JQuery является «лучшим» решением.

b1nary.atr0phy 03.10.2012 05:01

Я только что внес существенные дополнения в этот ответ - основная часть такая же, но я был бы признателен за отзывы о том, есть ли какие-либо ошибки или места для дальнейшего улучшения.

Peter Boughton 12.12.2012 22:24

При создании регулярного выражения с переменной для имени класса мне пришлось искать синтаксис: var regExp = new RegExp('(?:^|\s)' + classToAddOrRemove + '(?!\S)', 'g');

Walter 30.01.2013 20:44

Здесь отсутствует одна важная деталь - разница между фреймворком и библиотекой. jQuery - это библиотека, а не фреймворк. Например, для безопасности примера фреймворком может быть angularJs.

brunoais 08.04.2013 11:23
(Вы можете указать список элементов, разделенных пробелами.) You must mean a list of classes to assign, not elements to select.
DrJonOsterman 03.08.2013 01:23

Действительно отличный ответ, который полностью не отвечает на вопрос OP: как вы изменять значение существующего класса?

Peter Flynn 06.01.2014 14:13

Если он не отвечает на вопрос ОП, почему они отметили его как решение? Ваш вопрос кажется другим (возможно, вы хотите изменить свойства / объявления CSS, связанные с именем класса? Не уверен, позволяют ли браузеры это) - почему бы не уточнить, что вам нужно, в новый вопрос, который точно объясняет, что вы хотите / пытаетесь добиться?

Peter Boughton 06.01.2014 20:37

Что касается пункта «Добавить дополнительный класс к элементу» (2-й в списке), я считаю, что лучше всего взять текущий el.className, объединить строку с " class-to-add" и, наконец, вызвать .trim() в строке перед обновлением целевого элемента. Тем не менее, я не думаю, что CSS действительно заботится о \s, отдельные классы элемента в любом случае определяются списком, разделенным пробелами.

user909694 22.01.2015 12:26

хех: var a=[];e.className=((a=e.className.split(" ")).splice(a.indexOf(oldClass),1,newClass)&&a).join(" ").trim();: D

Duncan 06.03.2015 22:04

Не могли бы вы переставить вещи? По моему мнению classList с прокладкой для поддержки браузера должен быть вверху.

Marcel Burkhard 02.06.2015 16:04

Было бы здорово, если бы что-то подобное тоже работало, удалить имя класса: document.getElementById("MyElement").className -= " MyClass";

Nick Humphrey 29.07.2015 11:53

поэтому ответ будет просто $ ('# MyElement'). toggleClass ('MyClass'); спасибо, у меня работает

Shady Mohamed Sherif 05.10.2015 17:15

Привет. Мне было интересно, что вы скажете об использовании границ слов вместо (?: \ S) в начале и (?! \ S) в конце вашего регулярного выражения. Комментарии? document.getElementById("MyElement").className.replace( /\bMyClass\b/g , '' ). Кажется, у меня никогда не было причин использовать многие сокращения регулярных выражений, но похоже (кажется), что это тоже может сработать. Хотя \ b имеет ограничения на то, что он считает символом слова, и вы никогда не знаете, что кто-то может использовать в качестве имени класса.

Anthony Rutledge 07.11.2015 12:57

\ b соответствует дефисам.

Peter Boughton 07.11.2015 17:23

Есть более быстрые методы, чем удаление класса с помощью RegExp, особенно если вы собираетесь превратить его в полифилл. См. jsperf.com/removeclass-methods

thdoan 24.11.2015 11:48

В коде в разделах Чтобы удалить класс из элемента: и Чтобы проверить, применен ли уже класс к элементу: отсутствует ; с конца строки. Для этого есть причина? Также было бы неплохо, если бы в Чтобы удалить класс из элемента: была заметка, указывающая, что происходит с пробелами. В противном случае это очень хороший ответ.

Trisped 21.03.2016 21:38

Я бы предпочел, чтобы (^start(\s+start)*\s*)|((?:\s+)start(?!\S+)) удалил слово start из списка, разделенного пробелами.

Andreas Dyballa 24.05.2016 15:18

Угловой: angular.element (document.getElementById ("MyElement")). Remove‌ Class ("имя-класса"); angular.element (document.getElementById ("MyElement")). addCla‌ ss ("имя-класса")

Zymotik 02.06.2016 16:59

Привет, это очень хороший ответ. Я хочу изменить класс при каком-либо условии при загрузке html, а не о событии нажатия кнопки. обратитесь к этому вопросу: stackoverflow.com/questions/38028756/…

pankaj 25.06.2016 17:13

Ваш метод удаления класса почти заботится об удалении лишних пробелов, которые могут появиться после удаления элементов. Но может случиться так, что результат начнется с ведущего пробела. Если вы добавите .trim (), ваш метод удаления класса не будет содержать лишних пробелов.

rosell.dk 17.10.2016 23:42

Кроме того, вы можете безопасно удалить «?:» В начале регулярного выражения, чтобы оно читалось: new RegExp («(\\ s | ^)« + className + »(?! \\ S) "," г ")

rosell.dk 17.10.2016 23:45

Я создал обширный тест альтернатив для удаления имени класса. Ваше решение находится в стадии тестирования. Тест доступна здесь

rosell.dk 17.10.2016 23:48

@Zymotik, возможно, вы захотите добавить еще один отдельный ответ вместо редактирования чужого ответа. Это полезный фрагмент, но это должен быть собственный ответ.

TankorSmash 01.03.2017 20:32

@PoornaSenaniGamage - В вашей редакции говорится, что причиной было «улучшенное форматирование». Интересно, как вы могли считать это «улучшением»? Это было хорошо до вашего редактирования, и хорошо, что это просто «хорошо» после вашего редактирования. Вы просто заменили один стандартный метод форматирования кода, который предпочитает (ну, по крайней мере, выбран) исходным автором, на другой стандартный метод форматирования кода, который вам больше нравится. То, что ваша редакция была одобрена, для меня загадка, поскольку мне кажется, что это неуместная редакция. Согласились, что это не особо значительный вопрос. Кто-нибудь другой, пожалуйста, дайте мне знать, если я не в порядке.

Kevin Fegan 12.10.2018 22:27

Отличный ответ, жаль, что вы не упомянули пример «(Вы можете использовать список, разделенный пробелами, чтобы применить несколько классов.)», Потому что это сэкономило бы так много времени.

JGallardo 17.10.2019 15:25

Линия

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

должно быть:

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

Неправильно. RegEx отделяется косой чертой. Добавление кавычек вызывает сбой в IE, возвращая строку класса, который вы пытаетесь удалить, вместо фактического удаления класса.

Dylan 15.08.2011 01:46

Измените класс 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

В одном из моих старых проектов, в котором не использовался 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.

Это отлично подходит, когда ваш клиент не позволяет вам использовать jQuery. (Потому что вы в конечном итоге почти создаете свою собственную библиотеку.)

Mike 24.07.2013 09:16

@Mike Если клиент не позволяет вам использовать jQuery, не могли бы вы просто пройти и перестроить только те функции, которые вам нужны, в свою собственную библиотеку?

kfrncs 18.11.2013 09:04

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

Mike 18.11.2013 23:17

Чувак, сейчас 4 часа ночи, и большое тебе спасибо. Vanilla JS - это то, что мы используем в моем проекте, и это спасло мне жизнь.

LessQuesar 16.12.2015 12:25

Это мое любимое решение. Я везде им пользуюсь. Я считаю, что это самый элегантный способ добавления и удаления классов, когда в вашем проекте еще нет другого способа сделать это.

WebWanderer 18.10.2017 00:36

Следует отметить, что после использования addClass и removeClass в одном элементе className элемента будет содержать дополнительный пробел. Строка модификации className removeClass должна быть обновлена ​​до ele.className = ele.className.replace(reg, ' ').trim().replace(/\s{2,}/g, ' ');. Это удаляет оставшиеся конечные пробелы и сворачивает несколько пробелов в одно пространство в className.

WebWanderer 18.10.2017 00:45

Вы также можете просто сделать:

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

И чтобы переключить класс (удалите, если он существует, добавьте его):

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

Я считаю, что это зависит от HTML5.

John 27.10.2011 21:16

Вам понадобится прокладка classList Эли Грея.

ELLIOTTCABLE 14.11.2011 18:34
Сеть разработчиков Mozilla states that it doesn't work, natively, in Internet Explorers less than 10. I find the statement to be true, in my testing. Apparently, the Прокладка Eli Grey is required for Internet Explorer 8-9. Unfortunately, I couldn't find it on his site (even with searching). The shim is available on the Mozilla link.
doubleJ 29.10.2012 08:13

Функция поддерживается несколько часов назад (добавлена ​​в IE10 и Android 3)

andreszs 03.08.2014 03:13
Вот документация MDN для classList.
Ajedi32 15.06.2015 18:56

atow "classList" частично поддерживается в IE10 +; нет поддержки Opera Mini; иначе полная поддержка в остальных стандартных браузерах: caniuse.com/#search=classlist

Nick Humphrey 29.07.2015 11:47

Думаю, прокладку Eli Grey можно найти здесь ...

Wilf 06.09.2015 19:54

Используя чистый код 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);
    }
}

Чтобы добавить информацию из другого популярного фреймворка, 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];

Это работает для меня:

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

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

Отличный ответ! Осталось добавить: установите для каждого имени класса CSS для селектора, чтобы указать стиль для группы элементов класса.

Roman Polen. 08.05.2012 15:19

У меня это работает на FF, но когда я пытался использовать el.className = "newStyle"; это не сработало, почему?

Lukasz 'Severiaan' Grela 19.07.2012 16:29

Вы можете использовать el.setAttribute('class', newClass) или лучше el.className = newClass. Но не el.setAttribute('className', newClass).

Oriol 11.02.2015 18:54

Вау, удивлен, что здесь так много лишних ответов ...

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

Я бы сказал, что ненавязчивый javascript - ужасная практика для написания примера кода ...

Gabe 13.04.2012 18:50

Я бы не согласился, потому что я считаю, что пример кода должен служить хорошим примером.

thomasrutter 30.03.2015 02:36

Хороший пример должен одновременно и наставлять, и пробуждать воображение. Он должен не заменять мысль, а вдохновлять ее.

Anthony Rutledge 31.10.2015 07:01

Другие ответы не являются излишними, они также сохраняют существующие классы в элементе.

gcampbell 04.06.2016 18:04

Несколько незначительных замечаний и поправок к предыдущим регулярным выражениям:

Вы захотите сделать это глобально, если список классов имеет имя класса более одного раза. И вы, вероятно, захотите удалить пробелы с концов списка классов и преобразовать несколько пробелов в одно, чтобы избежать пробелов. Ничего из этого не должно быть проблемой, если единственный код, связанный с именами классов, использует регулярное выражение ниже и удаляет имя перед его добавлением. Но. Ну, кто знает, кто может возиться со списком имен классов.

Это регулярное выражение нечувствительно к регистру, поэтому ошибки в именах классов могут появиться до того, как код будет использован в браузере, который не заботится о регистре в именах классов.

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, ' ') + "]");

Я бы использовал jQuery и написал бы что-то вроде этого:

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

Этот код добавляет функцию, вызываемую при щелчке по элементу с идентификатором какой-то элемент. Функция добавляет щелкнул к атрибуту класса элемента, если он еще не является его частью, и удаляет его, если он есть.

Да, вам нужно добавить ссылку на библиотеку jQuery на своей странице, чтобы использовать этот код, но, по крайней мере, вы можете быть уверены, что большинство функций в библиотеке будут работать практически во всех современных браузерах, и это сэкономит вам время при реализации ваш собственный код, чтобы сделать то же самое.

Спасибо

Вам нужно всего лишь один раз написать jQuery в полной форме. jQuery(function($) { }); делает $ доступным внутри функции во всех случаях.

ThiefMaster 13.06.2012 18:38

Вот моя версия, полностью рабочая:

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")' >

Это нарушит класс foobar, если вы попытаетесь удалить класс foo. JS в атрибутах внутреннего обработчика событий был поврежден перед редактированием. Принятый ответ 4-летнего ребенка намного лучше.

Quentin 17.10.2012 16:25

спасибо, я исправил (не проблема с префиксом). это старый принятый ответ, в котором есть ошибка с регулярным выражением.

alfred 17.10.2012 16:27

В коде все еще есть проблема с foobar. Смотрите тест здесь

rosell.dk 17.10.2016 15:11

Также вы можете расширить объект HTMLElement, чтобы добавить методы для добавления, удаления, переключения и проверки классов (суть):

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

Вот демонстрация.

это немного многословно ... вот очень емкое решение ... jsfiddle.net/jdniki/UaT3P

zero_cool 18.08.2014 23:28

Извините, @Jackson_Sandland, но вы полностью упустили суть, которая заключается в том, чтобы вообще не использовать jQuery.

moka 21.08.2014 12:36

Я использую в своем коде следующие ванильные функции 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 в современных браузерах.

Вот простой код jQuery для этого.

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

Здесь,

  • Class1 - это слушатель события.
  • Родительский класс - это класс, в котором размещается класс, который вы хотите изменить.
  • Classtoremove - это ваш старый класс.
  • Добавляемый класс - это новый класс, который вы хотите добавить.
  • 100 - время ожидания, в течение которого изменяется класс.

Удачи.

Просто подумал, что брошу это:

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(' ');
}

Вот 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

также см. мой ответ здесь для динамического создания нового класса

Измените класс элемента в обычном 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>

Рабочий код 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>

Вы можете скачать рабочий код с сайта эта ссылка.

Это приведет к разрыву элементов с более чем одним классом.

gcampbell 04.06.2016 18:09

просто скажите 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>

Хорошо, я думаю, что в этом случае вам следует использовать 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');

classList DOM API:

Очень удобный способ добавления и удаления классов - это classList DOM API. Этот API позволяет нам выбирать все классы определенного элемента DOM, чтобы изменить список с помощью javascript. Например:

const el = document.getElementById("main");
console.info(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>
  

Да, есть много способов сделать это. В синтаксисе 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>

Много ответов, много хороших ответов.

TL;DR :

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

ИЛИ ЖЕ

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

Вот и все.

И, если вы действительно хотите узнать, почему, и самообразоваться, я предлагаю прочитать Ответ Питера Ботона, это идеально.

Примечание:
Это возможно с (документ или мероприятие):

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

пытаться

element.className='second'

function change(box) { box.className='second' }
.first  { width:  70px; height:  70px; background: #ff0                 }
.second { width: 150px; height: 150px; background: #f00; transition: 1s }
<div onclick = "change(this)" class = "first">Click me</div>


ВАРИАНТЫ.

Вот несколько примеров стиля и списка классов, чтобы вы могли увидеть, какие варианты у вас есть, и как использовать classList, чтобы делать то, что вы хотите.

style против 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.

classList Пример

Допустим, у нас есть <div class = "class-a class-b">, в этом случае у нас уже есть 2 класса, добавленные к нашему элементу div, 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")


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)

В 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

Вопрос OP был Как я могу изменить класс элемента с помощью JavaScript?

Современные браузеры позволяют сделать это с одной строкой javascript:

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

Атрибут classList предоставляет DOMTokenList с разнообразие методов. Вы можете работать со списком классов элемента, используя простые манипуляции, такие как добавлять(), Удалить() или заменять(). Или получите очень сложные и манипулируйте классами, как объект или карту, с помощью ключи (), значения(), записи ()

Ответ Питера Ботона - отличный вариант, но ему уже больше десяти лет. Все современные браузеры теперь поддерживают DOMTokenList - см. https://caniuse.com/#search=classList, и даже IE11 поддерживает некоторые методы DOMTokenList.

Другие вопросы по теме