Skip to content

Instantly share code, notes, and snippets.

@E01T
Created July 26, 2013 12:07
Show Gist options
  • Save E01T/6088383 to your computer and use it in GitHub Desktop.
Save E01T/6088383 to your computer and use it in GitHub Desktop.
getElementsByClassName shims. Various shims solving this problem
/*
All the getElementsByClassName functions below are in:
http://snook.ca/archives/javascript/your_favourite_1
*/
if( typeof document.getElementsByClassName !== "function"){
document.getElementsByClassName= function( className, nodeName ){
var a = [];
var re = new RegExp('(^| )'+className+'( |$)');
var els = nodeName.getElementsByTagName("*");
for(var i=0,j=els.length; i<j; i++)
if(re.test(els[i].className))a.push(els[i]);
return a;
};
}
////////////////////////////////////////////////////////////////////
// The two functions below seem to be the most complete(cross browser) solution.
// document.all is equavallent to getElementsByTagName of IE 5
if( document.all && !document.getElementsByTagName ){
document.getElementsByTagName = function( nodeName )
{
if( nodeName == '*' ) return document.all;
var result = [], rightName = new RegExp( nodeName, 'i' ), i;
for( i=0; i<document.all.length; i++ )
if( rightName.test( document.all[i].nodeName ) )
result.push( document.all[i] );
return result;
};
} // end if
// This if statement is my addition, the original code does not have it, it overrides the default function anyway
if( typeof document.getElementsByClassName !== "function"){
document.getElementsByClassName = function( className, nodeName )
{
var result = [], tag = nodeName||'*', node, seek, i;
if( document.evaluate ){
seek = '//'+ tag +'[@class="'+ className +'"]';
seek = document.evaluate( seek, document, null, 0, null );
while( (node = seek.iterateNext()) )
result.push( node );
}else{
var rightClass = new RegExp( '(^| )'+ className +'( |$)' );
seek = document.getElementsByTagName( tag );
for( i=0; i<seek.length; i++ )
if( rightClass.test( (node = seek[i]).className ) )
result.push( seek[i] );
}
return result;
};
} // end if
/////////////////////////////////////////////////////////////////////
// This look good as well it uses document.querySelectorAll function which is IE8 specific
// and then for older versions of IE but not IE 5.x. Maybe by using the getElementsByTagName function
// above I sould be able to solve this problem.
if (!document.getElementsByClassName) {
document.getElementsByClassName = function(search) {
var d = document, elements, pattern, i, results = [];
if (d.querySelectorAll) { // IE8
return d.querySelectorAll("." + search);
}
if (d.evaluate) { // IE6, IE7
pattern = ".//*[contains(concat(' ', @class, ' '), ' " + search + " ')]";
elements = d.evaluate(pattern, d, null, 0, null);
while ((i = elements.iterateNext())) {
results.push(i);
}
} else {
elements = d.getElementsByTagName("*");
pattern = new RegExp("(^|\\s)" + search + "(\\s|$)");
for (i = 0; i < elements.length; i++) {
if ( pattern.test(elements[i].className) ) {
results.push(elements[i]);
}
}
}
return results;
};
}
/////////////////////////////////////////////////////////////////////
/* Also check this code at google:
https://code.google.com/p/getelementsbyclassname/source/browse/trunk/getElementsByClassName.js
However it looks complicated and cumbersome.
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment