Reputation: 4818
I would like the ability to add a class to an element and not replace what classes are already there.
Here is my javascript so far:
function black(body) {
var item = document.getElementById(body);
if (item) {
item.className=(item.className=='normal')?'black':'normal';
}
}
That piece of javascript replaces the existing classes with black
. If the class already is black
then it is changed to normal
.
I would like to somehow combine the script above with the script below script, which adds a class, instead of replacing all existing classes.
var item = document.getElementById("body");
item.className = item.className + " additionalclass";
Upvotes: 5
Views: 2731
Reputation: 1
I don't know if this is what you want or not because the answers here seems complicated to me...Anyway I needed to add class name without replacing the old one, so this is how I did it..
menu.children[i].getElementsByTagName('a')[0].**classList.add('resetAfter')**;
here i used classList.add()
to append classes into anchor tag.
Upvotes: 0
Reputation: 707328
Here are several plain javascript functions you can use for manipulating class names in plain javascript. It takes a little extra work in these functions to match whole class names only and avoid any extra spaces before/after classnames:
function removeClass(elem, cls) {
var str = " " + elem.className + " ";
elem.className = str.replace(" " + cls + " ", " ").replace(/^\s+|\s+$/g, "");
}
function addClass(elem, cls) {
elem.className += (" " + cls);
}
function hasClass(elem, cls) {
var str = " " + elem.className + " ";
var testCls = " " + cls + " ";
return(str.indexOf(testCls) != -1) ;
}
function toggleClass(elem, cls) {
if (hasClass(elem, cls)) {
removeClass(elem, cls);
} else {
addClass(elem, cls);
}
}
function toggleBetweenClasses(elem, cls1, cls2) {
if (hasClass(elem, cls1)) {
removeClass(elem, cls1);
addClass(elem, cls2);
} else if (hasClass(elem, cls2)) {
removeClass(elem, cls2);
addClass(elem, cls1);
}
}
If you wanted to toggle between the black
and normal
classes without affecting any other classes on the specified object, you could do this:
function black(id) {
var obj = document.getElementById(id);
if (obj) {
toggleBetweenClasses(obj, "black", "normal");
}
}
Working example here: http://jsfiddle.net/jfriend00/eR85c/
If you wanted to add the "black" class unless "normal" was already present, you could do this:
function black(id) {
var obj = document.getElementById(id);
if (obj && !hasClass(obj, "normal")) {
addClass(obj, "black");
}
}
Upvotes: 4
Reputation: 11764
In case you are not going to add/remove/toggle classes that much, I would consider using something like the code below (instead of adding 2-3 functions like jfriend00's answer).
So here is the alternative for the ones that don't like to have many functions that will not use that frequently:
function toggle(id) {
var obj = document.getElementById(id), str, len;
if (obj) {
str = " " + obj.className + " ";
len = str.length;
str = str.replace(" normal ", " ");
if (str.length != len) {
str += " black";
} else {
str = str.replace(" black ", " ");
if (str.length != len) {
str += " normal";
}
}
obj.className = str.replace(/^\s+|\s+$/g, "");
}
}
It basically stores the length, tries to replace, checks if it removed the class (by comparing old and new lengths) then applies the necessary changes.
Note: it will toggle the classes perfectly with the condition that you should not have the two classes at the same time at the beginning.
Upvotes: 0