IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

要素をキャッシュして $ 関数をちょっと高速化

prototype.js の $ 関数で

あっちこっちで、$、$、ってやるとその都度ノード探索発生してうざいので

prototype.js 1.5 の $ 関数

function $() {
  var results = [], element;
  for (var i = 0; i < arguments.length; i++) {
    element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);
    results.push(Element.extend(element));
  }
  return results.length < 2 ? results[0] : results;
}

キャッシュしてみますた。

でも、IDがダイナミックに変更される場合(あんまないでしょ)はダメ

↓要素のキャッシュ化

$.cache = {};
function $() {
  var results = [], element;
  for (var i = 0; i < arguments.length; i++) {
    element = arguments[i];
    if (typeof element == 'string') {
      var cache = arguments.callee.cache;
      element = cache[element] || (cache[element] = document.getElementById(element));
    }
    results.push(Element.extend(element));
  }
  return results.length < 2 ? results[0] : results;
}

さらに、

細かな高速化、二箇所

$.cache = {};
function $() {
  var results = [], element;
  for (var i = 0, len = arguments.length; i < len; i++) {
    element = arguments[i];
    if (typeof element == 'string') {
      var cache = arguments.callee.cache;
      element = cache[element] || (cache[element] = document.getElementById(element));
    }
    results[i] = Element.extend(element);
  }
  return results.length < 2 ? results[0] : results;
}

引数に id を指定すると内部的に $ が呼ばれているので、そういう場合はけっこう早くなるかも

では、そろそろ Shibuya.JS に向かいます。