Skip to content

Instantly share code, notes, and snippets.

@arcdev1
Created May 5, 2014 03:05
Show Gist options
  • Save arcdev1/b7be9d0a4d56da7ba697 to your computer and use it in GitHub Desktop.
Save arcdev1/b7be9d0a4d56da7ba697 to your computer and use it in GitHub Desktop.
/**
* Original code developed by Robert Nyman, http://www.robertnyman.com
* Code/licensing: http://code.google.com/p/getelementsbyclassname/
*
* Arcnovus modifications:
* - Tweaked code to pass JSLint validation (all vars declared together, no more assignment in expressions).
* - Added 'item' method to array returned in order to mimick nodeList
*/
(function (window, document) {
'use strict';
document.getElementsByClassName = function (className, tag, elm) {
var i, il, j, jl, k, kl, l, ll, m, ml,
elements, nodeName, returnElements, current,
classes, classesToCheck, xhtmlNamespace, namespaceResolver, node,
match;
returnElements = [];
/**
* This method mimicks the 'item' method of a NodeList object.
* Adding it here prevents code that expects getElementsByClassName
* to return a nodelist from potentially breaking.
* param: idx {Number} index of item to return
*/
returnElements.item = function (idx) {
return this[idx];
};
if (document.getElementsByClassName) {
document.getElementsByClassName = function (className, tag, elm) {
elm = elm || document;
elements = elm.getElementsByClassName(className);
nodeName = (tag) ? new RegExp("\\b" + tag + "\\b", "i") : null;
for (i = 0, il = elements.length; i < il; i += 1) {
current = elements[i];
if (!nodeName || nodeName.test(current.nodeName)) {
returnElements.push(current);
}
}
return returnElements;
};
} else if (document.evaluate) {
document.getElementsByClassName = function (className, tag, elm) {
tag = tag || "*";
elm = elm || document;
classes = className.split(" ");
classesToCheck = "";
xhtmlNamespace = "http://www.w3.org/1999/xhtml";
namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace) ? xhtmlNamespace : null;
for (j = 0, jl = classes.length; j < jl; j += 1) {
classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
}
try {
elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
} catch (e) {
elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
}
do {
node = elements.iterateNext();
returnElements.push(node);
} while (node);
return returnElements;
};
} else {
document.getElementsByClassName = function (className, tag, elm) {
tag = tag || "*";
elm = elm || document;
classes = className.split(" ");
classesToCheck = [];
elements = (tag === "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag);
for (k = 0, kl = classes.length; k < kl; k += 1) {
classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
}
for (l = 0, ll = elements.length; l < ll; l += 1) {
current = elements[l];
match = false;
for (m = 0, ml = classesToCheck.length; m < ml; m += 1) {
match = classesToCheck[m].test(current.className);
if (!match) {
break;
}
}
if (match) {
returnElements.push(current);
}
}
return returnElements;
};
}
return document.getElementsByClassName(className, tag, elm);
};
}(this, this.document));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment