Работая над прототипами JavaScript-ядра для веб-приложения с рабочим названием «Scratch», переодически приходится использовать функцию console.log() (FireFox-плагина FireBug) для отладки JS-сценариев. Казалось бы всё хорошо, но моим любимым браузером уже много лет является Opera, а полноценного плагина FireBug для него, как вы знаете, нет. При этом, использовать альтернативные решения типа FireBug-lite и Dragonfly до сей день большого желания не возникает… А вот желание выводить на экран отладочную информацию, да так, чтобы происходило это независимо от того, в каком браузере запущено приложение и установлен ли плагин FireBug – всё же возникло, для чего была очень спешно написана следующая функция:
(function() {
var wa = window.alert;
window.alert = function() {
if(window.console)console.log(arguments);
else return wa.apply(this, arguments)
}
})();
Версия для работы в связке с HabraAlert:
(function() {
var wa = window.alert;
window.alert = function() {
window.console && console.log(arguments);
if("function" === typeof initHA) {
var a = Object.apply(this, arguments);
a.constructor == Array || a.constructor == Object ? message(print_r(a, "")) : encode_entities(message(a))
} else return wa.apply(this, arguments)
};
/* optional */
if("undefined" === typeof initHA) {
window.warning = function() {};
window.error = function() {}
}
/* optional */
})();
function encode_entities(s){
return s.replace(/[>&"]/g, function(m){
return {'':'<', '>':'>', '&':'&', '"':'"'}[m] || m;
})
}
function print_r(o, s) {
if(o.constructor == Array || o.constructor == Object) {
s += '
- ';
for(var i in o)if(o[i].constructor == Array || o[i].constructor == Object) {
s += "
- [" + i + "] => " + typeof o + " "; s = '
- [" + i + "] => " + encode_entities(o[i]) + " "; s += "
- ' + print_r(o[i], s) + "
Подозреваю в будущем будет рефакторинг и расширение функционала… ;)