Console2
Все меньше и меньше остается времени у шестого IE, все больше и больше сайтов объявляют, что они перестают поддерживать дизайн и скрипты для него. Напомню что шестой IE был выпущен в 1999 году то есть 10 лет назад, а до сих пор "популярен". Уже даже сам мелкософт заявил о том что будет распространять седьмой IE как стандартное обновление. Но эта тема все еще может быть актуально потому что даже в седьмом IE нет консоли, и потому что в Opera и у Safari она находиться в зачаточном состоянии по сравнению с firebug'ом. Так вот я и решил то пока еще не поздно написать вторую версию консоли. Заодно углубил свои знания и отточил практику. Теперь она работает еще быстрее и надежнее, хотя все еще не лишена кое каких глюков, например типа-массив arguments так и не покорился. И еще я не хочу чтоб вы думали что дальше я начну накладывать какие-то визуальные эффекты типа плавающих дивов вместо аллертов, я не хочу создавать второй furebug lite.
Итак собственно код, его стало немного больше но на много повысилась производительность. Возможно стоило собрать все методы в объект и наверное я это сделаю но не сейчас, сейчас ее надо потестить в реальных условиях.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script>
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]);
}
}
</script>
</head>
<body>
</body>
</html>
И собственно мои тест-кейсы:
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
}
Комментарии