Created
July 16, 2014 15:37
-
-
Save h1k3r/f892e69b9a806de7fc8b to your computer and use it in GitHub Desktop.
Cross-browser js function to retrieve elements by classname from dom. Based on prototype js code
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
var getElementsByXPath = function(xpath, parentElement) { | |
var xpathResult = document.evaluate(xpath, parentElement, null, XPathResult.ANY_TYPE, null); | |
var results = []; | |
var element = xpathResult.iterateNext(); | |
while(element) { | |
results.push(element); | |
element = xpathResult.iterateNext(); | |
} | |
return results; | |
} | |
function hasClassName(element, className) { | |
return (' ' + element.className + ' ').indexOf(' ' + className + ' ') > -1; | |
} | |
var getElementsByClassName = function(className, parentElement) { | |
if (parentElement.getElementsByClassName) { | |
return parentElement.getElementsByClassName(className); | |
} else if (!!document.evaluate) { //detect xpath like prototype does | |
var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; | |
return getElementsByXPath(q, parentElement); | |
} else { | |
var children = parentElement.getElementsByTagName('*'); | |
var elements = [], child; | |
for (var i = 0, length = children.length; i < length; i++) { | |
child = children[i]; | |
if (hasClassName(child, className)) { | |
elements.push(child); | |
} | |
} | |
return elements; | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Some tests http://ejohn.org/blog/getelementsbyclassname-speed-comparison/