Как добавить класс к данному элементу?
у меня есть элемент, который уже имеет класс:
<div class="someclass">
<img ... id="image1" name="image1" />
</div>
теперь я хочу создать функцию Javascript, которая добавит класс в div
(не заменить, а добавить).
Как я могу это сделать?
22 ответа:
добавьте пробел плюс имя вашего нового класса в
className
свойства элемента. Во-первых, поставитьid
элемент, так что вы можете легко получить ссылку.<div id="div1" class="someclass"> <img ... id="image1" name="image1" /> </div>
затем
var d = document.getElementById("div1"); d.className += " otherclass";
см. также элемент.имя класса на MDN.
самый простой способ сделать это без каких-либо рамок заключается в использовании элемент.classList.добавить метод.
var element = document.getElementById("div1"); element.classList.add("otherclass");
Edit: И если вы хотите удалить класс из элемента -
element.classList.remove("otherclass");
Я предпочитаю не добавлять пустое пространство и дублировать обработку записей самостоятельно (что требуется при использовании
document.className
подхода). Есть некоторые ограничения браузера, но вы можете обойти их с помощью полифиллы.
найти целевой элемент "d", как вы хотите, а затем:
d.className += ' additionalClass'; //note the space
вы можете обернуть это более умными способами, чтобы проверить предсуществование и проверить требования к пространству и т. д..
Добавить Класс
Кроссплатформенными
в следующем примере мы добавляем
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;
ссылки
Используя Прототип
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")
другой подход для добавления класса в элемент с помощью чистого JavaScript
для добавления класса:
document.getElementById("div1").classList.add("classToBeAdded");
для удаления класса:
document.getElementById("div1").classList.remove("classToBeRemoved");
когда работа, которую я делаю, не требует использования библиотеки, я использую эти две функции:
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; }
предполагая, что вы делаете больше, чем просто добавляете этот класс (например, у вас есть асинхронные запросы и т. д.), Я бы рекомендовал библиотеку, такую как прототип или jQuery.
это сделает почти все, что вам нужно сделать (в том числе это) очень просто.
Итак, предположим, что у вас есть jQuery на Вашей странице, вы можете использовать такой код, чтобы добавить имя класса к элементу (при загрузке, в этом случае):
$(document).ready( function() { $('#div1').addClass( 'some_other_class' ); } );
Проверьте jQuery API browser для других вещей.
Вы можете использовать classList.добавить или список классов.удалить метод для добавления / удаления класса из элемента.
var nameElem = document.getElementById("name") nameElem.classList.add("anyclss")
приведенный выше код добавит (а не заменит) класс "anyclass" к nameElem. Аналогично вы можете использовать classList.метод remove () для удаления класса.
nameElem.classList.remove("anyclss")
добавить дополнительный класс к элементу:
чтобы добавить класс к элементу, не удаляя / влияя на существующие значения, добавьте пробел и новое имя класса, например:
document.getElementById("MyElement").className += " MyClass";
чтобы изменить все классы для элемента:
чтобы заменить все существующие классы одним или несколькими новыми классами, установите атрибут className:
document.getElementById("MyElement").className = "MyClass";
(вы можете использовать разделенный пробелами список для применения нескольких классов.)
Если вы не хотите использовать jQuery и хотите поддерживать старые браузеры:
function addClass(elem, clazz) { if (!elemHasClass(elem, clazz)) { elem.className += " " + clazz; } } function elemHasClass(elem, clazz) { return new RegExp("( |^)" + clazz + "( |$)").test(elem.className); }
просто чтобы уточнить, что сказали другие, несколько классов CSS объединяются в одну строку, разделенную пробелами. Таким образом, если бы вы хотели жестко закодировать его, он просто выглядел бы так:
<div class="someClass otherClass yetAnotherClass"> <img ... id="image1" name="image1" /> </div>
оттуда вы можете легко получить javascript, необходимый для добавления нового класса... просто добавьте пробел, за которым следует новый класс, к свойству className элемента. Зная это, вы также можете написать функцию для удаления класса позже, если возникнет такая необходимость.
чтобы добавить, удалить или проверить классы элементов простым способом:
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');
Я знаю, что 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');
вы можете использовать современный подход, подобный 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>
образец с чистым JS. В первом примере мы получаем идентификатор нашего элемента и добавляем, например, 2 класса.
document.addEventListener('DOMContentLoaded', function() { document.getElementsById('tabGroup').className = "anyClass1 anyClass2"; })
во втором примере мы получаем имя класса элемента и добавляем еще 1.
document.addEventListener('DOMContentLoaded', function() { document.getElementsByClassName('tabGroup')[0].className = "tabGroup ready"; })
Я думаю, что лучше использовать чистый JavaScript, который мы можем запустить на DOM браузера.
вот функциональный способ его использования. Я использовал ES6, но не стесняйтесь использовать ES5 и выражение функции или определение функции, в зависимости от того, что подходит вашему стилю JavaScript.
'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) } }
Я тоже думаю, что самый быстрый способ-это использовать элемент.прототип.список классов, как в es5:
document.querySelector(".my.super-class").classList.add('new-class')
но в IE8 нет такого понятия, как элемент.прототип.classList, в любом случае вы можете заполнить его этим фрагментом (fell free для редактирования и улучшения):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 }) }
во-первых, дайте div идентификатор. Затем вызовите функцию 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>
вы можете использовать API querySelector для выбора элемента, а затем создать функцию с элементом и новым именем класса в качестве параметров. Использование classlist для современных браузеров, иначе для 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');
для тех, кто использует Лодашь и желая обновить
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()
этот код js работает для меня
обеспечивает замену classname
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
надеюсь, что это полезно для sombody
в Юи, если вы включите yuidom, вы можете использовать
YAHOO.util.Dom.addClass('div1','className');
HTH