Как стать автором
Обновить

Комментарии 78

Несомненно поможет! Годная статья, в избранное :)
— «в избранное — непременно в избранное»
Так на всякий случай добавлю, что для всех браузеров есть getfirebug.com/lite.html
Я его использую в Опере, если надо какие-то косяки с версткой поправить: просто кнопка inspect у него очень удобно расположена :)
Пользуюсь подобным, для подключения firebug.lite.js на всех проектах, в независимости от браузера.

 if (typeof(console) != 'object') {
    var firebug = {env: {css : "PATH_TO_CSS/firebug-lite.css"}};

    var doc = window["document"]||null;
    var script = doc.createElement('script');
    script.setAttribute('type', 'text/javascript');
    script.setAttribute('src' , "PATH_TO_FIREBUGLITE/firebug-lite-compressed.js");
    doc.getElementsByTagName('head')[0].appendChild(script);
 }

Даже для не слишком новичка полезно прочитать.
После релиза все if (allow… удаляются или allow просто выставляется в false?

В целом спасибо, было интересно.
Извиняюсь, промахнулся. Ответ на ваш вопрос — чуть ниже
Спасибо, полезная статья.
Человек! Человечище! Спасибо!
За отладку в IE отдельно спасибо!
Спасибо за статью, вы возвращаете мою веру в хабр :)
А меня Debug Bar зацепил больше, чем IE8 Developer panel. Последняя тормозит у меня.
Ну и недавно обсуждавшаяся DynaTrace AJAX toolbar тоже очень полезная штука.

А статья шикарная.
Вообще можно и оставить. Только я написал allowBreakpoints, что есть не очень хорошо. Лучше эту переменную не помещать в глобальный scope, а создать свой небольшой а-ля namespace (который будет подключаться на каждую страницу сайта):
var MyTools = {
    debug: {
      isOn: false
    }
}
// ...
// где-то в коде:
if (MyTools.debug.isOn)
    console.log(some_var)

* This source code was highlighted with Source Code Highlighter.

А ещё можно обернуть console.log своим методом:
var MyTools = {
    debug: {
        isOn: false,
        log: function() {
            if (this.isOn && window.console)
                console.log.apply(console, arguments);
        },
        stop: function() {
            if (this.isOn)
                debugger;
        }
    }
};
// ...
// где-то в коде:
MyTools.debug.log(some_var);
MyTools.debug.stop();

* This source code was highlighted with Source Code Highlighter.
Прошу прощения, это был ответ на коммент, я промахнулся
НЛО прилетело и опубликовало эту надпись здесь
sedoy, зачем убиваешь себя?
console.log вылетает в IE любой версии, в Chrome, firefox — нет (ну это касается продакшн).
для ие можно сделать свой лог)

if(!window.console)
{
console = {};
console.log = function(message){alert('Консоль говорит: \n\n' + message)};
}
или выводить все в какой-нибудь элемент в dom
Да, я упомянал в статье Firebug Lite или Blackbird

В обоих вариантах — вывод в какой-то ДОМ-элемент

И потом это прикрутить вот сюда — вот и получится универсальный логгер с флажком! :)
конечно можно, я просто добавил уточнение про то, что будет если его не убрать в продакшн
для продакшена можно просто переопределить console для всех браузеров
Я в своих проектах с целью недопущения logging'а до продакшна использую следующий код, возможно он будет интересен или полезен:
ProjectNamespace.log = function ()
{
if (! ProjectNamespace.MUTED_CONSOLE
&& typeof(console) != 'undefined'
&& typeof(console.log) == 'function')
{
console.log.apply(null, arguments);
}
};
}

Соответственно, при необходимости дебага вызывается ProjectNamespace.log() вместо console.log, и на продакшне ProjectNamespace.MUTED_CONSOLE ставится в true.
Если есть сторонний код, из которого вызывается console.log напрямую, или же просто не хочется изменять своим привычкам, то для безопасности продакшна можно сделать следующий финт ушами:

ProjectNamespace.originalConsole = console;
ProjectNamespace.log = function ()
{
if (! ProjectNamespace.MUTED_CONSOLE
&& typeof(ProjectNamespace.originalConsole) != 'undefined'
&& typeof(ProjectNamespace.originalConsole.log) == 'function')
{
ProjectNamespace.originalConsole.log.apply(null, arguments);
}
};
}

console.log = ProjectNamespace.log;
У меня в Safari под Windows при остановке на breakpoint, в окне пропадает исходник Javascript. То есть можно жать кнопки пошагового прохода, справа меняется номер строки и значения переменных, но вместо когда — пустой прямоугольник. Пришлось искать ошибку другим способом. Safari вроде последний, 4.0.4.

Собственно, Safari был нужен только потому, что пользователь Safari жаловался, что у него не работает сайт.
Лучший дебаггер для javascript — это понимание того, как устроен javascript (а не только библиотеки), и в первую очередь, наверное, замыкания.
Да, тут без понимания и шага не сделаешь.

Но когда перед тобой огромный проект, с нескольколетней историей разработки и сотней тысяч строк — тут без дебага не обойтись
Это условие почти всегда необходимое, но довольно редко достаточное для оперативного решения задач отладки.
если нужно посмотреть значение объектов, можно использовать
console.log('%o',obj)
Аякс запросы (какие данные передали, какому скрипту, что вернул скрипт) кроме как в firebug можно просматривать?
Firebug
Opera Dragonfly -> Network Tab = показывает AJAX
Safari/Chrome WebInspector -> Resources Tab = показывает AJAX
IE — я не нашёл. Но можно поставить себе на комп что-то типа Fiddler, тогда и с IE разберёмся :)
Спасибо. Глаза открыли)
Сафари/Хром показывают что вернул скрипт, Opera Dragonfly — нет, но и знать какой скрипт запрашивается очень помогает
Для IE есть неплохой плагинчик HTTP Analyzer
Для аякса есть прекрасный плагин HTTPWatch под Internet Explorer, вообще мощная утилита.
Аналог у Firefox это HTTPFox

P.S. Утилиты не только для Аякса, отнюдь, снифает весь трафик.
alert — очень хорошо, если нужно посмотреть информацию которую можно увидеть через алерт, то следует использовать именно его, метки дебага — отлично и удобно, но они пассвино заставляют забывать дебаги в коде, а со временем еще и специально оставлять, мозг сам аргументирует: «не влияет на работу, ну и оставим, на всякий случай» в итоге получаем в релизе кучу инфы для дебага, помоему это плохо
Я сделал console.js. Это скрипт-прокладка для API консоли Firebug-а. Полезен для Оперы и IE. Умеет «разворачивать» объекты, в отличие от alert-а и opera.postError.

alert({x:3, y:5}) --> [object Object]
alert(document.body) --> [object HTMLBodyElement]

console.log({x:3, y:5}) --> { 'x': 3, 'y': 5 }
console.log(document.body) --> <BODY class="timeline" id="home">
В ie8 выдает ошибку Объект не поддерживает это свойство или метод console.group(«basic arrays and objects»);
в opera 10.00 не вижу что бы что-то писалось в лог
в хроме 3.0.195.33 только надписи object
В IE8 и Хроме этот скрипт ничего не делает. Первая строчка скрипта: if (typeof console === 'undefined') {, а там консоль определена.

В IE8 нету console.group. Получается ошибка. Исправлю как-нибудь.

В Опере у меня работает нормально.

В Хроме 4 должно быть как на скриншоте. Не знаю как в 3-й, меня она мало интересует.

можно вопрос? а то мне всегда было интересно как люди выкручиваются :)
как вы выбираетесь из ситуации, когда надо узнать, какие обработчики висят на элементе?
если есть элемент с несколькими классами, на каждый из которых есть свой обработчик.
Отличная штука, тоже рекомендую.
Recommended Configuration
Firefox 3.7a1pre
Firebug 1.5b1
Eventbug 0.1a2
Не слабо.
Только в 3.7 появился getListenerInfoFor. До этого не было никакого механизма для просмотра событий.
Отличная статья, наконец-то узнал как ошибки в скриптах вылавливать… :) а то все по методу черного ящика кодил… :)
+ отличные комментарии
В Опере так и не смог толком подебажить.
Debug через alert()
«Это наименее информативный debug, который к тому же останавливает поток Javascript. Да к тому же модальный по отношению к браузеру. Забудьте, что он вообще существует.»

БРЕД.
кучу раз встречал случай когда алерт лучшее решение (в том числе так как он останавливает исполнение)
плюс дебаггеры очеь плохо относятся к подгружаемому eval коду который ещё и меняется постоянно…
Может быть это моё личное мнение, но когда, когда alert() лучше, чем приведённые мной способы (breakpoints, debugger, console.log/dir, ...)?

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

breakpoints тоже тормозят поток, но при этом дают возможность осмотреться в scope. И не модальный.
console.log/dir — не тормозит поток, но более информативен, т.к. даёт заглянуть внутрь объекта. И не модальный.

Чем же alert() лучше?
Возможно, просто привычка :)

К плюсам: alert, в отличие от console.log никак не забудешь удалить перед продакшеном))

Для мелких скриптов alert отличное решение.
Упс, не посмотрел на дату статьи))
Спасибо, полезная статья!
Как сказано автором, действительно очень просто забыть console.log в коде, ловился на этом и было не очень приятно за такую детскую ошибку, в каждом проекте есть функция-синоним вида function c(x){ try{console.log(x); }catch{} }. и пользоваться быстрее с(yourElement) и IE не падает.
НЛО прилетело и опубликовало эту надпись здесь
смотреть на каком месте пупыжит и читать мсдн про это
Отлаживайте в ие8 в режие ие7.
Как вариант:
поставить в IE7 script Debugger + Firebug Lite. Ну и + хорошее знание JS и проекта :)
Внесу свою посильную лепту.

Когда дебажим под IE8. Во встроенном Developer Tools есть переключатель режима обозревателя: ie7, ie8, представление совместимости ie8. Кроме того, можно изменять и режим документов: стандарты ie7, стандарты ie8 и режим совместимости, он же quirks mode. Исходя из понимания последнего названия, данный режим заставляет браузер работать, учитывая «особенности и ошибки конкурирующих или старых версий программных продуктов» (с, Википедия) — в общем, с намеком на ie6 и ко.
Не могу со 100% вероятностью сказать, насколько точно ie7-режимы совпадают с реальностью. Однако эмпирически было проверено, что после корректного отображения в этом режиме, реальный ie7 показал корректно. quirks mode особо не использовал.

И еще момент. Вряд ли кому открою Америку, но сам почему-то не сразу догадался до подобного. В общем, часто встает необходимость вывести дебаг в формате: метка + значение. Причем значение может быть объектом. Конечно, можно выводить в разных строках, но тогда при больших объемах лога становится трудно разбирать что и где (как минимум не наглядно). Вариант решения: console.log([ label, value ]); — соответственно будет и метка, и значение. Плюс возможность сразу просмотреть объект (в том же firebug). Как вариант, можно обернуть в {} — для массового вывода ;)
В console.log можно написать, например, так:

console.log(label, value, label, value, value, value);

И все будет прекрасно выводиться и не нужно оборачивать ничего.
НЛО прилетело и опубликовало эту надпись здесь
Возможно кому-то поможет:

Иногда необходимо вывести в лог свой объект со всеми свойствами, или в alert, чтобы посмотреть что-то по-быстрому. Для приведения объекта к строке браузеры вызывают ему toString(). Этот метод определен в основных типах (типа Object, Function и т.д.). Однако, приведение объекта к строке по-умолчанию возвращает [object Object].

Идея в том, чтобы в своих объектах перегрузить метод toString, чтобы выводить что-нибудь полезное. Например так:

var MyObj = {
	property1 : "qwerty",
	property2 : 100500,
	anotherProperty : true,
	method1 : function() {
		// do something
	},
	toString : function() {
		return "{\n" + 
		"  property1 : " + this.property1 + ",\n" + 
		"  property2 : " + this.property2 + ",\n" + 
		"  anotherProperty : " + this.anotherProperty + "\n" +
		"}";		
	}
};


Теперь вызов alert(MyObj) будет выводить не [object Object], а все свойства объекта:

{
  property1 : qwerty,
  property2 : 100500,
  anotherProperty : true
}
Продолжая мысль… не обязательно держать определение объекта и его toString вместе.
Можно написать в продакшн коде:
var MyObj = {
	property1 : "qwerty",
	property2 : 100500,
	anotherProperty : true,
	method1 : function() {
		// do something
	}
};


А в отдельном файле (например, debug.js) написать следующее:

if(MyObj)
{
	MyObj.toString = function() {
		return "{\n" + 
		"  property1 : " + this.property1 + ",\n" + 
		"  property2 : " + this.property2 + ",\n" + 
		"  anotherProperty : " + this.anotherProperty + "\n" +
		"}";		
	}
}


И подключать его по мере надобности, т.е. во время разработки
Еще как вариант — написать общую функцию, где for (var i in object)… вывести поля. можно рекурсивно — тогда не придется заморачиваться под каждый новый объект.
Тоже вариант, но тогда будет меньше контроля над тем, как отображать содержимое.
Тут уже каждый решает в каждом конкретном случае, что лучше )
Продолжу мысль:

  • -> переопределить toString
  • -> вынести toString и применять к любому объекту
  • ->сделать рекурсивный пробег по иерархии объекта (попутно избежав бесконечной рекурсии)
  • -> сделать красивый вывод иерархии объекта (с "±" и т.д.) в какой-нибудь DIV коммандой console.log(obj)
  • -> чёрт, это всё уже сделано в Firebug Lite! :) Скачать, пользоваться на здоровье :)


Понимать, как это работает — здорово. Но надо экономить своё время и уметь полагаться на 3d-party разработки ;)
> -> переопределить toString

Не стоит. Object.prototype.toString — особенный ;)
Отличная статья, спасибо!
Спасибо! Неплохая статья — я не слышал про дебаг для Opera`ы и Safari/Chrome — так что нашёл ссылки довольно ценными.

Маленькое дополнение — есть, на мой взгляд, отличный проект Log4Javascript ( log4javascript.org/ ), который достоин, на мой взгляд, упоминания в этой статье — он позволяет упростить кроссбраузерный логгинг. Идея взята из мира Java — его прототипом выступил очень известный там проект Log4J.

Я стараюсь его использовать и советую всем, кто разрабатывает серьёзные проекты с активным использованием JS к нему присмотреться.
Отличный пример грамотно написаной статьи. Не напрягая мозги все понял.
Удобно включать режим отладки из адресной строки, например дописывая в неё #console

if(typeof allow_console == 'undefined'){
   var allow_console= false;

   var hash = location.hash;
   if(hash.indexOf('#console')!=-1){
     allow_console = true;
   }
}
if(allow_console==true){
console.log('Режим отладки включен');
}
Отличная статья, сэкономили очень много времени, спасибо!
console.log('Режим отладки включен'); не выводит в консоль ошибок FF
Отлаживаю скрипт во встроеyном в FF редакторе JavaScript, Окружение — Браузер
console.log — это вывод в Системную консоль Windows (запуск firefox.exe -console)?
Как можно вывести сообщение в консоль ошибок?
Попробуйте console.error('text'), если нужно вывести именно ошибку.
спасибо, но в ни в консоль ошибок, ни в системную консоль Win и console.error('text'); не выводит

dump('DUMP-1 \n'); в системную консоль Win выводит
Картинки поломались =(
Ага, теперь вот думаю, как их восстановить
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации