ActionScriptで使うlog関数のエラー対策

2008.01.31 / actionscript

ActionScript3で使うと便利なライブラリでlog関数があります。

  log(s);
  

で呼び出したときに、Firebugがインストールされてあると、console.log(s)が実行される仕掛けです。

ただし、この関数はFirebugがインストールされてあることが前提のものなので、たとえばIEを利用している場合は表示がおかしくなる場合があります。(真っ白になったり。)なので、console.logを呼び出す際にうまくラップしてあげた方がベターです。たとえばこんな感じ。

  package {
    import flash.external.ExternalInterface;
    import flash.utils.getQualifiedClassName;
  
    public function log(... args):void {
      var inspect:Function = function(arg:*, bracket:Boolean = true):String {
          var className:String = getQualifiedClassName(arg);
          var str:String;
  
          switch(getQualifiedClassName(arg)) {
              case 'Array':
                var results:Array = [];
                for (var i:uint = 0; i < arg.length; i++) {
                    results.push(inspect(arg[i]));
                }
                if (bracket) {
                  str = '[' + results.join(', ') + ']';
                } else {
                  str = results.join(', ');
                }
                break;
              case 'int':
              case 'uint':
              case 'Number':
                str = arg.toString();
                break;
              case 'String':
                str = arg;
                break;
              default:
                str = '#<' + className + ':' + String(arg) + '>';
          }
          return str;
      }
      
      var r:String = inspect(args, false);
      trace(r)
      ExternalInterface.call('function(){ if(typeof console == \'object\' && typeof console.log == \'function\') return console.log.apply(this, arguments)}', r);
    }
  }
  

console, console.logの存在判定してるだけですけども、忘れて素のlog関数をコードに入れっぱなしにしておくと思わぬハマり方をする場合もあると思うので、こんな風に予防線張っておくのもいいかと思います。