JSFiddle - React, Tailwind, and code Playground
by Graham Fairweather
HTML
<div class='A'></div>
<div class='B'></div>
<div class='A B'></div>
<div class='C'></div>
<div class='D'></div>
JavaScript
var whiteSpaces = '[\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]',
starts = '(^|' + whiteSpaces + ')',
ends = '(' + whiteSpaces +'|$)';
function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}
function getElementsByClassName1(node, className) {
var regex = new RegExp(starts + className + ends),
results = [];
walkTheDOM(node, function (currentNode) {
if (regex.test(currentNode.className)) {
results.push(currentNode);
}
});
return results;
}
function getElementsByClassName2(node, className) {
var array = [],
regex = new RegExp(starts + className + ends),
elements = node.getElementsByTagName("*"),
length = elements.length,
i = 0,
element;
while (i < length) {
element = elements[i];
if (regex.test(element.className)) {
array.push(element);
}
i += 1;
}
return array;
}
function getElementsByClassName3(node, className) {
var results = [],
treeWalker = document.createTreeWalker(
node,
NodeFilter.SHOW_ELEMENT, {
acceptNode: function (thisNode) {
var accept = NodeFilter.FILTER_SKIP;
if (thisNode.classList.contains(className)) {
accept = NodeFilter.FILTER_ACCEPT;
}
return accept;
}
}, false);
while (treeWalker.nextNode()) {
results.push(treeWalker.currentNode);
}
return results;
}
function getElementsByClassName4(node, className) {
return Array.prototype.slice.call(document.getElementsByClassName(className));
}
function indexOf(array, searchElement, fromIndex) {
var length = array.length,
val = -1,
...