console.log || alert
Работая над прототипами 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 += '<ul style="margin:0;padding-left:20px">'; for(var i in o)if(o[i].constructor == Array || o[i].constructor == Object) { s += "<li>[" + i + "] => " + typeof o + "</li>"; s = '<ul style="margin:0;padding-left:5px">' + print_r(o[i], s) + "</ul>"; } else s += "<li>[" + i + "] => " + encode_entities(o[i]) + "</li>"; s += "</ul>"; return s } } // usage: var w = ['hello', 'world!']; var a = [';)']; alert(w, a); warning('my warning'); error('my error'); // or: message('something went wrong', "warning"); message('shit happens', "error", 7500); |
Подозреваю в будущем будет рефакторинг и расширение функционала… ;)