オブジェクト調査用関数

作ったのを忘れないようメモ。たいしたものではありません。。。

2008/01/15 変更

関数そのもののprototype.js依存を解消しました。
既出のオブジェクトは追わないようにしました。
デフォルトで表示する階層を3、各プロパティを20までに制限しました。引数で変更可能です。

})(Prototype);

})(document.body, "test", 2, 30);

にすれば、bodyのメンバをid:testの要素内(別途作成)に、最大2階層、各30メンバまで表示、ということになります。(最大階層・メンバ数を大きくするとブラウザによりエラーとされる場合があります。)

<html>
<head>
<title></title>
<body>
</body>
<script src="prototype.js"></script>
<script>
(function (obj, id, maxLevel, maxCount){

  var div = document.createElement('div');
  var text = document.createTextNode('');
  div.appendChild(text);
  function escapeHTML(str) {
    text.data = str;
    return div.innerHTML;
  }

  var elm = (typeof(id) == "string") ? document.getElementById(id) : id;
  if(maxLevel == null) maxLevel = 3;
  if(maxCount == null) maxCount = 20;
  var already = [];
  var str = (function(_obj, level){
    level++;
    var _callee = arguments.callee;
    var str = "<table border>";
    var count = 0;
    for(var key in _obj){
      if(count >= maxCount){
        str += "<tr><th><i>(OVER MAX COUNT=" + maxCount + ")</i></th><td></td></tr>";
        break;
      }
      var value = _obj[key];
      switch(typeof(value)){
        case "undefined":
          value = "undefined";
          break;
        case "boolean":
        case "number":
          break;
        case "string":
        case "function":
          value = escapeHTML(value.toString());
          break;
        case "object":
          if(value == null){
            break;
          }else if(value == elm){
            value = "<i>(THIS ELEMENT)</i>";
            break;
          }else{
            var flg = false;
            for(var i = 0; i < already.length; i++){
              if(already[i] == value){
                flg = true;
                break;
              }
            }
            if(flg){
              value = "<i>(ALREDY EXISTS)</i>";
            }else if(level >= maxLevel){
              value = "<i>object (OVER MAX LEVEL=" + maxLevel + ")</i>";
            }else{
              already.push(value);
              value = _callee(value, level);
            }
          }
          break;
        default:
          var msg = "unknown type : " + typeof(value);
          alert(msg);
          throw new Error(msg);
      }
      str += "<tr><th>" + escapeHTML(key) + "</th><td>" + value + "</td></tr>";
      count++;
    }
    str += "</table>";
    return str;
  })(obj, 0);
  if(elm == null){
    elm = document.createElement("div");
    document.body.appendChild(elm);
  }
  elm.innerHTML = str;
  
})(Prototype);
</script>
</html>

v1.6.0を読みはじめました(今更^^;)。やっぱりえらく複雑になってますね・・・。解読したのがv1.4.0の頃でよかった。今だったら挫折してる気がします><;

↑はその一環で書いたものです。

記録を載せるかは未定です。書くとしても個人的なメモ程度になると思います。