debugモジュールをIE8に対応させる
debugを気に入って使ってるのだけど、IE8で使ってみたらログが出力されなかった。
どうも、debugが標準で持っているログの関数がIE8で出力しないように意図せずなっているようで、それを修正したら出力された。
return 'object' == typeof console
- && 'function' == typeof console.log
+ && ('function' == typeof console.log || 'object' == typeof console.log)
&& Function.prototype.apply.call(console.log, console, arguments);
IE8だとtypeof console.log
がobject
を返すのだけど、function
で比較していたので出力されなかったみたいだ。
ソースコードを修正するのが面倒な場合はモンキーパッチを当てられるので、以下のようにするとdebugのコードをいじらなくて済む。
debug.log = function log() {
return 'object' == typeof console
&& ('function' == typeof console.log || 'object' == typeof console.log)
&& Function.prototype.apply.call(console.log, console, arguments);
};
ついでに、console.log
でなくてconsole.dir
にしようと思ったらIE8はconsole.dir
を持っていなかった。
あとJSON.stringify
を使ってオブジェクトを文字列で表示しようと思ったのだけど、循環参照があるとダメだった。循環参照を無視するようなコードも書いてみたのだけど、イベントなどを渡すとreplacer
の関数がスタックオーバーフローしてダメだった。ちなみに循環参照のObjectをJSON.stringifyするを参考にした。
How do I dump JavaScript vars in IE8?を見かけたので試してみたら、Watchのタブでツリー状に変数の値を見ることができたので、IE8はdebugで頑張るよりもWatchで見た方がいいみたいだ。