Feb 15th 2010 × Creating a wrapper namespace for the FireBug console.log function for IE and other browsers
Most web application/AJAX development takes place within the confines of either FireFox + Firebug or Webkit browsers and their consoles (firebug is now available on chrome?). However, other browsers (such as IE) lack console functionality and this presents a problem.
When in a hurry / under pressure, I have been known to forget to take out a console reference out of code that sneaks it’s way into the production environment. If not immediately noticeable, tucked away behind a loop / if statement, you’d never know about it… That is, until the error reports start flooding in.
Not wanting to find myself in such position again, I decided to write a little wrapper that can cater for nearly all of firebug’s console methods. The most common ones, such as console.log, console.info, console.clear and console.count are pre-defined but you can use the model and add others into the singleton. Check this fine firebug cheatsheet for more ideas on other methods you may want to port.
var $C = {
// console wrapper by D. Christoff @ http://fragged.org/
_version: 2.1.3,
debug: true, // global debug on|off
quietDismiss: false, // may want to just drop, or alert instead,
method: "log",
_hasConsole: function(_method) {
var _method = _method || "log";
return typeof(console) == 'object' && typeof(console[_method]) != "undefined";
},
_consoleMethod: function() {
if (!this.debug) return false;
if (this._hasConsole(this.method)) {
try {
console[this.method].apply(this, arguments);
} catch(e) {
// safari console may not accept scope like so
for (var i = 0, l = arguments.length; i < l; i++)
console[this.method](arguments[i]);
}
} else if(!this.quietDismiss && arguments.length) {
var result = "";
for (var i = 0, l = arguments.length; i < l; i++)
result += arguments[i] + " ("+typeof arguments[i]+") ";
alert(result);
}
},
log: function() {
this.method = "log";
this._consoleMethod.apply(this, arguments);
},
info: function() {
this.method = "info";
this._consoleMethod.apply(this, arguments);
},
clear: function() {
this.method = "clear";
this._consoleMethod.apply(this);
},
count: function() {
this.method = "count";
this._consoleMethod.apply(this, arguments);
},
debug: function() {
this.method = "debug";
this._consoleMethod.apply(this);
}
}; // end console wrapper.
// example data and object
$C.clear();
var foo = "foo", bar = document.getElementById("divImage");
$C.log(foo, bar);
$C.count("loop");
$C.info("we are inside a loop!");
$C.count("loop");
The interface is simple, just use the "$C" namespace (name it what you like) instead of "console" will have the preserved functionality / results within FireFox, whereas IE users can either see an alert pop-up dialogue or nothing at all (if $C.quietDismiss = true).
// To disable the alerts in IE, do $C.quietDimiss = true; // To disable debug completely: $C.debug = false;
I hope somebody finds this useful...
update history
*update* thanks to divide by zero for the improvement - in this post.
*update again* this is a fix from the previous update, seems that safari's console cannot accept scoping through apply so I added a try {} catch {} block where it reverts to the old loop
*update again (15/02/10)* modded to support any possible console method with ease
1 Comment to Creating a wrapper namespace for the FireBug console.log function for IE and other browsers
[...] Hier habe ich ein kleines Script gefunden, was überprüft, ob console definiert ist und wenn nicht, dann wird stattdessen ein Javascript-alert mit der logging-Ausgabe gemacht. Weil dies auf die Dauer aber auch nerven kann, kann man den alert über eine Variable einfach wieder abschalten. [...]
Would you like to leave a comment?
You must be logged in to post a comment.



