Created
May 5, 2014 03:05
-
-
Save arcdev1/b7be9d0a4d56da7ba697 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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