Console2

Все меньше и меньше остается времени у шестого IE, все больше и больше сайтов объявляют, что они перестают поддерживать дизайн и скрипты для него. Напомню что шестой IE был выпущен в 1999 году то есть 10 лет назад, а до сих пор «популярен». Уже даже сам мелкософт заявил о том что будет распространять седьмой IE как стандартное обновление. Но эта тема все еще может быть актуально потому что даже в седьмом IE нет консоли, и потому что в Opera и у Safari она находиться в зачаточном состоянии по сравнению с firebug’ом. Так вот я и решил то пока еще не поздно написать вторую версию консоли. Заодно углубил свои знания и отточил практику. Теперь она работает еще быстрее и надежнее, хотя все еще не лишена кое каких глюков, например типа-массив arguments так и не покорился. И еще я не хочу чтоб вы думали что дальше я начну накладывать какие-то визуальные эффекты типа плавающих дивов вместо аллертов, я не хочу создавать второй furebug lite.

Итак собственно код, его стало немного больше но на много повысилась производительность. Возможно стоило собрать все методы в объект и наверное я это сделаю но не сейчас, сейчас ее надо потестить в реальных условиях.


var cast = function(i) {
	// call lazy function definition
	return  (cast = !document.fileSize  // IE any version
		? function(i){return Array.prototype.slice.call(i);}
		: function(i){var l=i.length,a=[];while(l--){a[l]=i[l];}return a;}
	)(i);
},

show = function(m) {
	return (show=window.opera?window.opera.postError:window.alert)(m);
},

dump = function (x, max, sep, l) {
	l = l || 0, 
	max = max || 3, 
	sep = sep || "\t";
	if (l > max) {
		return "[WARNING: Too much recursion]\n";
	}
	var i, 
		r = '', 
		t = typeof x, 
		tab = '';

	if (x === null) {
		r += "(null)\n";
	} else if (t == "object") {
		for (i=0,l++;i<l;i++) {tab += sep;}
		if (x && (x.length || x.length==0)) {t = 'array';}
		r += "(" + t + ") :\n";
		for (i in x)
			try { r += tab + "[" + i + "] : " + dump(x[i], max, sep, l+1);} catch(e) { return "[ERROR: " + e + "]\n"; }
	} else {
		if (t=="string"&&x=="") 
			x = '(empty)';
		r += "(" + t + ") " + x + "\n";
	}
	return r;

},

myConsole = function(){
	var args = cast(arguments);
	
	if (args.length > 2){
		show(args.shift() +":\n"+ args.shift().replace(/(%[ds])/g, function(){
			return args.shift();
			})
		);
	}else{
		show(args.shift() +":\n"+ dump(args.shift()));
	}
};

if (window.loadFirebugConsole) { // since FireBug 1.2
	window.loadFirebugConsole();
} else if (!window.console) {
	window.console = {};
	var names = ["log", "debug", "info", "warn", "error"];
	for (var i in names){
		window.console[names[i]] = (function(name){return function(){
			myConsole.apply(null,[name].concat(cast(arguments)));
		}})(names[i]);
	}
}

И собственно мои тест-кейсы:


window.onload = function(){
	console.log("string: %d %s %d", 10, "text", 10);
	console.info({});
	console.info([]);
	console.info(null);
	console.info(window);
	console.info(document);
	console.info(document.getElementsByTagName("body"));
	console.info(document.getElementsByTagName("body")[0]);
	console.info(Math);
	(function(z){try {x.y = z;}catch(e){console.info(e);}})(null);
	//(function(x,y,z){console.info(arguments)})(1,2,3); // fail

}