素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

高速な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);
  }