HTML Preparation code:
AخA
 
1
<div id="foo"></div>
Script Preparation code:
x
 
function addClass(el, classNames)
{
  if (!classNames) { return; }
 
        if (!Object.prototype.toString.call(classNames) === "[object Array]")
        {
            classNames = classNames.split(' ');
        }
        var className = el.getAttribute("class") || "";
 
        var i, classMap = {}, currentClasses = [], length;
 
        if (className !== null)
        {
            currentClasses = className.split(" ");
 
            length = currentClasses.length;
            for (i = 0; i < length; i++)
            {
                if (currentClasses[i] !== "")
                {
                    classMap[currentClasses[i]] = "";
                }
            }
        }
 
        var changed = false, trimmedName;
        var newAdded = [];
        length = classNames.length;
        for (i = 0; i < length; i++)
        {
            trimmedName = classNames[i].trim();
            if ((trimmedName.length > 0) && !(trimmedName in classMap))
            {
                currentClasses.push(trimmedName);
                newAdded.push(trimmedName);
                classMap[trimmedName] = "";
                changed = true;
            }
        }
 
        if (changed)
        {
            el.setAttribute("class", currentClasses.join(" ").trim());
        }
 
        return newAdded;
}
function addClass2(el, classNames)
{
  if (!classNames) { return; }
 
        if (!Object.prototype.toString.call(classNames) === "[object Array]")
        {
            classNames = classNames.split(' ');
        }
        var className = el.getAttribute("class") || "";
  
        var trimmedName;
        var newAdded = [];
        var length = classNames.length;
        var list = el.classList;
        for (i = 0; i < length; i++)
        {
            trimmedName = classNames[i].trim();
            list.add(trimmedName);
        }
  
        return newAdded;
}
Tests:
  • addClass function

     
    var i = 1000;
    while (i--) {
        var element = document.getElementById("foo");
        element.className = "bar2";
        addClass(element, ["bar", "bar2", "bar3"]);
    }
  • classList

     
    var i = 1000;
    while (i--) {
      var element = document.getElementById("foo");
      element.className = "bar2";
      var list = element.classList;
      list.add("bar");
      list.add("bar2");
      list.add("bar3");
    }
  • classList multiple params

     
    var i = 1000;
    while (i--) {
        var element = document.getElementById("foo");
        element.className = "bar2";
        element.classList.add("bar", "bar2", "bar3");
    }
  • addClass function with classList

     
    var i = 1000;
    while (i--) {
        var element = document.getElementById("foo");
        element.className = "bar2";
        addClass2(element, ["bar", "bar2", "bar3"]);
    }
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    addClass function
    classList
    classList multiple params
    addClass function with classList

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 4 years ago)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.51
Chrome 86 on Windows
View result in a separate tab
Test name Executions per second
addClass function 275.9 Ops/sec
classList 278.6 Ops/sec
classList multiple params 458.3 Ops/sec
addClass function with classList 255.3 Ops/sec