高速なgetElementsByClassName
追記:ちょっとコードを短くした。
メモ化、正規表現を使わない工夫、メソッド呼び出しを減らすなど、地味に努力した。
けっこう速いと思う。
引数には、順不同で複数のクラス名を渡せる("foo bar"、"bar foo"みたいに)。
if (typeof HTMLElement.prototype.getElementsByClassName!="function") HTMLElement.prototype.getElementsByClassName=function(className) { var names=className.split(/\s+/), all=this.getElementsByTagName("*"), memo={}, ret=[]; for(var i=0,l=all.length,elem,iname,flag;i<l;i++) { elem=all[i]; iname=elem.className; if (!(iname in memo)) memo[iname]=" "+iname.toLowerCase()+" "; for (var j=0,jname;j<names.length;j++) { jname=names[j]; if (!(jname in memo)) memo[jname]=" "+jname.toLowerCase()+" "; if(flag=memo[iname].indexOf(memo[jname])!=-1)continue; else break; } if(flag)ret[ret.length]=elem; } return ret; } if (typeof document.getElementsByClassName!="function") document.getElementsByClassName=function(className) { return document.documentElement.getElementsByClassName(className); }