Как я могу изменить класс элемента HTML в ответ на onclick или любые другие события с помощью JavaScript?
element.setAttribute(name, value); Замените name на class. Замените value на любое имя, которое вы дали классу, заключенное в кавычки. Это позволяет избежать необходимости удалять текущий класс и добавлять другой. Этот jsFiddle пример показывает полный рабочий код.
Для изменения класса 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-класса-w3schools. Вот ссылка на заменяющую страницу на w3schools.com: Атрибут HTML-класса-w3schools.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проще всего это сделать с такой библиотекой, как 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]
В этом контексте это не псевдопротокол - это метка цикла ... только для нее нет цикла TO метки.
На самом деле это не псевдопротокол, он интерпретируется как метка JavaScript, например, то, что вы можете использовать в цикле. Можно было легко сделать onClick = "myScriptYo:do_it();". Но, пожалуйста, не делай этого.
Без обид, но неразумно менять класс на лету, поскольку это заставляет интерпретатор CSS пересчитывать визуальное представление всей веб-страницы.
Причина в том, что интерпретатору CSS практически невозможно узнать, можно ли изменить какое-либо наследование или каскадирование, поэтому краткий ответ:
Никогда не меняйте className на лету! -)
Но обычно вам нужно изменить только одно или два свойства, и это легко реализуется:
function highlight(elm){
elm.style.backgroundColor = "#345";
elm.style.color = "#fff";
}
Я никогда не испытывал проблем с производительностью при переключении классов CSS. Я думаю, какая бы производительность ни была там мощь, она намного перевешивается беспорядком из-за того, что стили / представление смешиваются в вашем javascript.
Хм, очевидно, вы его никогда не тестировали ... В приложении реального времени, состоящем из тысяч строк, вложенных с другими элементами, я распознал задержку в несколько секунд, переделав ее только для изменения свойств, невозможно было распознать задержку ...
Зачем вам даже нужны тысячи строк, вложенных с другими элементами? Кроме того, с какой операционной системой и браузером была задержка?
Если изменение className вызывает заметные проблемы с производительностью, у вас гораздо большие проблемы со структурой и дизайном вашей страницы / приложения. В противном случае сокращение нескольких миллисекунд - не лучший повод засорять логику приложения стилями.
это худшая идея на свете. смена классов - это, безусловно, самый простой и понятный способ обновить CSS «на лету».
«Тысячи строк» неверующим: докислород. Иерархические складные меню в боковой рамке. У IE7 были фатальные проблемы с этим, поэтому я использовал Firefox.
Мне интересно, почему вы еще не удалили свой ответ! (это 2016 год)
@AlexJolig - пользователь не входил в систему с 2009 года
Это второй по популярности ответ на сайте.
Я думаю, что «вообще не делай этого» - неприемлемый ответ на вопрос «как это сделать».
Поэтому вместо изменения класса вы пишете встроенные стили вручную. Вы беретесь за работу CSS. Кстати, если вы отредактируете атрибут стиля, он также перерисует страницу, как если бы вы изменили класс. "очевидно, вы никогда не проверяли это" - покажите нам некоторые точные данные о том, насколько ваше решение быстрее. И, пожалуйста, не сообщайте нам такие данные, как «На 40% быстрее, когда вы выполняете 20 миллионов изменений» или что-то в этом роде.
Вы можете использовать node.className так:
document.getElementById('foo').className = 'bar';
Это должно работать в IE5.5 и выше в соответствии с PPK.
это перезапишет любые и все другие классы объекта ... так что это не так просто.
Современные браузеры добавили 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)/) )
Хотя можно писать 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, однако обычно используется либо фреймворк, либо библиотека для упрощения общих задач, а также для извлечения выгоды из исправленных ошибок и крайних случаев, о которых вы могли не думать при написании кода.
Хотя некоторые люди считают излишним добавлять фреймворк размером ~ 50 КБ для простого изменения класса, если вы выполняете какой-либо значительный объем работы с JavaScript или что-то, что может иметь необычное кроссбраузерное поведение, это стоит рассмотреть.
(Грубо говоря, библиотека - это набор инструментов, предназначенных для конкретной задачи, тогда как фреймворк обычно содержит несколько библиотек и выполняет полный набор функций.)
Приведенные выше примеры были воспроизведены ниже с использованием jQuery, вероятно, наиболее часто используемой библиотеки JavaScript (хотя есть и другие, которые тоже стоит изучить).
(Обратите внимание, что $ - это объект jQuery.)
$('#MyElement').addClass('MyClass');
$('#MyElement').removeClass('MyClass');
if ( $('#MyElement').hasClass('MyClass') )
Кроме того, jQuery предоставляет ярлык для добавления класса, если он не применяется, или удаления класса, который:
$('#MyElement').toggleClass('MyClass');
$('#MyElement').click(changeClass);
или без идентификатора:
$(':button:contains(My Button)').click(changeClass);
Отличный ответ Петр. Один вопрос ... почему лучше имеет отношение к JQuery, а не к Javascript? JQuery великолепен, но если это все, что вам нужно сделать - что оправдывает включение всей библиотеки JQuery вместо нескольких строк JavaScript?
@mattstuehler 1) фраза «еще лучше x» довольно часто означает «еще лучше (вы можете) x». 2) Чтобы понять суть вопроса, jQuery разработан для помощи в доступе / управлении DOM, и очень часто, если вам нужно делать такие вещи, когда вам нужно делать это повсюду.
Помните, что в случае добавления имени класса перед именем класса, которое вы хотите добавить, ДОЛЖНЫ быть пробелы.
если вы добавляете класс, удаляется ли предыдущий класс, или вам придется делать это вручную?
Предыдущие занятия останутся. Вам придется вручную удалить другие классы, если вы хотите это сделать.
Одна ошибка в этом решении: когда вы нажимаете кнопку несколько раз, он несколько раз добавляет к элементу класс «MyClass», а не проверяет, существует ли он уже. Таким образом, вы можете получить атрибут класса HTML, выглядящий примерно так: class = "button MyClass MyClass MyClass"
Я предполагаю, что решением будет: if ( ! document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) ) или, с jQuery: if ( ! $j('#MyElement').hasClass('MyClass') ) (хотя я подозреваю, что addClass не будет добавлять дубликаты?)
Если вы пытаетесь удалить класс myClass и у вас есть класс prefix-myClass, регулярное выражение, которое вы указали выше для удаления класса, оставит вас с prefix- в вашем className: O
Вау, три года и 183 положительных голоса, и до сих пор этого никто не заметил. Спасибо jinglesthula, я исправил регулярное выражение, чтобы оно не удаляло некорректно части имен классов. // Думаю, это хороший пример того, почему стоит использовать Framework (например, jQuery) - подобные ошибки обнаруживаются и исправляются раньше и не требуют изменений в обычном коде.
Я сделал несколько незначительных правок, чтобы улучшить ответ - надеюсь, люди согласятся, что это улучшения? Если что-то еще я пропустил, дайте мне знать (или просто отредактируйте ответ самостоятельно).
@PeterBoughton Не уверен, что это улучшение, но мне нравится: (' '+document.getElementById("MyElement").className+' ').replace( ' '+MyClass+' ' , '' )
@ PaulP.R.O. вы сворачиваете окружающие пробелы и регулярное выражение до нуля, что объединяет строки имени окружающего класса (если таковые имеются) вместе. Я думаю, что elem.className = elem.className.replace ('' + classname + '', '') - это то, что мы хотим. Спасибо!
Я использую аналогичные методы, но с регулярным выражением g (общим). причина именно в проблеме, описанной выше @Web_Designer: если пользователь нажимает несколько раз, вы получаете несколько экземпляров одного и того же класса, и все экземпляры должны быть удалены, чтобы удалить класс.
Импорт всей библиотеки для выполнения одной простой задачи - вот почему в Интернете так много накладных расходов. Поэтому я не согласен с тем, что использование JQuery является «лучшим» решением.
Я только что внес существенные дополнения в этот ответ - основная часть такая же, но я был бы признателен за отзывы о том, есть ли какие-либо ошибки или места для дальнейшего улучшения.
При создании регулярного выражения с переменной для имени класса мне пришлось искать синтаксис: var regExp = new RegExp('(?:^|\s)' + classToAddOrRemove + '(?!\S)', 'g');
Здесь отсутствует одна важная деталь - разница между фреймворком и библиотекой. jQuery - это библиотека, а не фреймворк. Например, для безопасности примера фреймворком может быть angularJs.
Действительно отличный ответ, который полностью не отвечает на вопрос OP: как вы изменять значение существующего класса?
Если он не отвечает на вопрос ОП, почему они отметили его как решение? Ваш вопрос кажется другим (возможно, вы хотите изменить свойства / объявления CSS, связанные с именем класса? Не уверен, позволяют ли браузеры это) - почему бы не уточнить, что вам нужно, в новый вопрос, который точно объясняет, что вы хотите / пытаетесь добиться?
Что касается пункта «Добавить дополнительный класс к элементу» (2-й в списке), я считаю, что лучше всего взять текущий el.className, объединить строку с " class-to-add" и, наконец, вызвать .trim() в строке перед обновлением целевого элемента. Тем не менее, я не думаю, что CSS действительно заботится о \s, отдельные классы элемента в любом случае определяются списком, разделенным пробелами.
хех: var a=[];e.className=((a=e.className.split(" ")).splice(a.indexOf(oldClass),1,newClass)&&a).join(" ").trim();: D
Не могли бы вы переставить вещи? По моему мнению classList с прокладкой для поддержки браузера должен быть вверху.
Было бы здорово, если бы что-то подобное тоже работало, удалить имя класса: document.getElementById("MyElement").className -= " MyClass";
поэтому ответ будет просто $ ('# MyElement'). toggleClass ('MyClass'); спасибо, у меня работает
Привет. Мне было интересно, что вы скажете об использовании границ слов вместо (?: \ S) в начале и (?! \ S) в конце вашего регулярного выражения. Комментарии? document.getElementById("MyElement").className.replace( /\bMyClass\b/g , '' ). Кажется, у меня никогда не было причин использовать многие сокращения регулярных выражений, но похоже (кажется), что это тоже может сработать. Хотя \ b имеет ограничения на то, что он считает символом слова, и вы никогда не знаете, что кто-то может использовать в качестве имени класса.
\ b соответствует дефисам.
Есть более быстрые методы, чем удаление класса с помощью RegExp, особенно если вы собираетесь превратить его в полифилл. См. jsperf.com/removeclass-methods
В коде в разделах Чтобы удалить класс из элемента: и Чтобы проверить, применен ли уже класс к элементу: отсутствует ; с конца строки. Для этого есть причина? Также было бы неплохо, если бы в Чтобы удалить класс из элемента: была заметка, указывающая, что происходит с пробелами. В противном случае это очень хороший ответ.
Я бы предпочел, чтобы (^start(\s+start)*\s*)|((?:\s+)start(?!\S+)) удалил слово start из списка, разделенного пробелами.
Угловой: angular.element (document.getElementById ("MyElement")). Remove Class ("имя-класса"); angular.element (document.getElementById ("MyElement")). addCla ss ("имя-класса")
Привет, это очень хороший ответ. Я хочу изменить класс при каком-либо условии при загрузке html, а не о событии нажатия кнопки. обратитесь к этому вопросу: stackoverflow.com/questions/38028756/…
Ваш метод удаления класса почти заботится об удалении лишних пробелов, которые могут появиться после удаления элементов. Но может случиться так, что результат начнется с ведущего пробела. Если вы добавите .trim (), ваш метод удаления класса не будет содержать лишних пробелов.
Кроме того, вы можете безопасно удалить «?:» В начале регулярного выражения, чтобы оно читалось: new RegExp («(\\ s | ^)« + className + »(?! \\ S) "," г ")
Я создал обширный тест альтернатив для удаления имени класса. Ваше решение находится в стадии тестирования. Тест доступна здесь
@Zymotik, возможно, вы захотите добавить еще один отдельный ответ вместо редактирования чужого ответа. Это полезный фрагмент, но это должен быть собственный ответ.
@PoornaSenaniGamage - В вашей редакции говорится, что причиной было «улучшенное форматирование». Интересно, как вы могли считать это «улучшением»? Это было хорошо до вашего редактирования, и хорошо, что это просто «хорошо» после вашего редактирования. Вы просто заменили один стандартный метод форматирования кода, который предпочитает (ну, по крайней мере, выбран) исходным автором, на другой стандартный метод форматирования кода, который вам больше нравится. То, что ваша редакция была одобрена, для меня загадка, поскольку мне кажется, что это неуместная редакция. Согласились, что это не особо значительный вопрос. Кто-нибудь другой, пожалуйста, дайте мне знать, если я не в порядке.
Отличный ответ, жаль, что вы не упомянули пример «(Вы можете использовать список, разделенный пробелами, чтобы применить несколько классов.)», Потому что это сэкономило бы так много времени.
Линия
document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace(/\bMyClass\b/','')
должно быть:
document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace('/\bMyClass\b/','');
Неправильно. RegEx отделяется косой чертой. Добавление кавычек вызывает сбой в IE, возвращая строку класса, который вы пытаетесь удалить, вместо фактического удаления класса.
Измените класс 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 Если клиент не позволяет вам использовать jQuery, не могли бы вы просто пройти и перестроить только те функции, которые вам нужны, в свою собственную библиотеку?
@kfrncs Потому что мне обычно не нужен такой большой фреймворк. Для проекта, о котором я думал, единственными функциями, которые мне были нужны, были 3 функции имени класса (имеет, добавить, удалить) и функции cookie (имеет, добавить, удалить). Все остальное было либо кастомным, либо изначально хорошо поддерживаемым. Таким образом, все вместе составляло всего 150 строк до минимизации, включая комментарии.
Чувак, сейчас 4 часа ночи, и большое тебе спасибо. Vanilla JS - это то, что мы используем в моем проекте, и это спасло мне жизнь.
Это мое любимое решение. Я везде им пользуюсь. Я считаю, что это самый элегантный способ добавления и удаления классов, когда в вашем проекте еще нет другого способа сделать это.
Следует отметить, что после использования addClass и removeClass в одном элементе className элемента будет содержать дополнительный пробел. Строка модификации className removeClass должна быть обновлена до ele.className = ele.className.replace(reg, ' ').trim().replace(/\s{2,}/g, ' ');. Это удаляет оставшиеся конечные пробелы и сворачивает несколько пробелов в одно пространство в className.
Вы также можете просто сделать:
document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');
И чтобы переключить класс (удалите, если он существует, добавьте его):
document.getElementById('id').classList.toggle('class');
Я считаю, что это зависит от HTML5.
Вам понадобится прокладка classList Эли Грея.
Функция поддерживается несколько часов назад (добавлена в IE10 и Android 3)
atow "classList" частично поддерживается в IE10 +; нет поддержки Opera Mini; иначе полная поддержка в остальных стандартных браузерах: caniuse.com/#search=classlist
Думаю, прокладку Eli Grey можно найти здесь ...
Используя чистый код 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 для селектора, чтобы указать стиль для группы элементов класса.
У меня это работает на FF, но когда я пытался использовать el.className = "newStyle"; это не сработало, почему?
Вы можете использовать el.setAttribute('class', newClass) или лучше el.className = newClass. Но не el.setAttribute('className', newClass).
Вау, удивлен, что здесь так много лишних ответов ...
<div class = "firstClass" onclick = "this.className='secondClass'">
Я бы сказал, что ненавязчивый javascript - ужасная практика для написания примера кода ...
Я бы не согласился, потому что я считаю, что пример кода должен служить хорошим примером.
Хороший пример должен одновременно и наставлять, и пробуждать воображение. Он должен не заменять мысль, а вдохновлять ее.
Другие ответы не являются излишними, они также сохраняют существующие классы в элементе.
Несколько незначительных замечаний и поправок к предыдущим регулярным выражениям:
Вы захотите сделать это глобально, если список классов имеет имя класса более одного раза. И вы, вероятно, захотите удалить пробелы с концов списка классов и преобразовать несколько пробелов в одно, чтобы избежать пробелов. Ничего из этого не должно быть проблемой, если единственный код, связанный с именами классов, использует регулярное выражение ниже и удаляет имя перед его добавлением. Но. Ну, кто знает, кто может возиться со списком имен классов.
Это регулярное выражение нечувствительно к регистру, поэтому ошибки в именах классов могут появиться до того, как код будет использован в браузере, который не заботится о регистре в именах классов.
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($) { }); делает $ доступным внутри функции во всех случаях.
Вот моя версия, полностью рабочая:
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-летнего ребенка намного лучше.
спасибо, я исправил (не проблема с префиксом). это старый принятый ответ, в котором есть ошибка с регулярным выражением.
В коде все еще есть проблема с foobar. Смотрите тест здесь
Также вы можете расширить объект 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
Извините, @Jackson_Sandland, но вы полностью упустили суть, которая заключается в том, чтобы вообще не использовать jQuery.
Я использую в своем коде следующие ванильные функции 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);
});
Здесь,
Удачи.
Просто подумал, что брошу это:
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
также см. мой ответ здесь для динамического создания нового класса
Вы можете попробовать использовать свойство узла 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>
Вы можете скачать рабочий код с сайта эта ссылка.
Это приведет к разрыву элементов с более чем одним классом.
просто скажите 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.
Допустим, у нас есть <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.
«Атрибут class в основном используется для указания класса в таблице стилей. Однако он также может использоваться JavaScript (через HTML DOM) для внесения изменений в элементы HTML с указанным классом». -w3schools.com/tags/att_standard_class.asp