javascript debuger
От: RobinHood  
Дата: 16.04.04 21:12
Оценка: +1
привет!
может кто небудь посоветует как делаеть debug javascript.
понимаю что можно делать что то типа алерт и вызывать в функции. но что делать если
функция возврашает object. неужели нет никакой возможности делать дебаг на клиентскои
стороне(имею доступ практически к любым средствам разработки vs7,6. может dot.net ето делает???)...
если кто знает какои то open sourse project на ету тему поделитесь ссилочкои
спасибо
Re: javascript debuger
От: Воронков Василий Россия  
Дата: 16.04.04 21:17
Оценка: +1
Здравствуйте, RobinHood, Вы писали:

RH>привет!

RH>может кто небудь посоветует как делаеть debug javascript.
RH>понимаю что можно делать что то типа алерт и вызывать в функции. но что делать если
RH>функция возврашает object. неужели нет никакой возможности делать дебаг на клиентскои
RH>стороне(имею доступ практически к любым средствам разработки vs7,6. может dot.net ето делает???)...
RH> если кто знает какои то open sourse project на ету тему поделитесь ссилочкои
RH>спасибо


В VS7 вообще есть дебагер скриптов. Есть еще и Microsoft Script Editor.
Re: javascript debuger
От: ЖуК Украина http://smart-ip.net/
Дата: 16.04.04 23:48
Оценка: 63 (6) +1
Здравствуйте, RobinHood, Вы писали:

RH>привет!

RH>может кто небудь посоветует как делаеть debug javascript.
RH>понимаю что можно делать что то типа алерт и вызывать в функции. но что делать если
RH>функция возврашает object. неужели нет никакой возможности делать дебаг на клиентскои
RH>стороне(имею доступ практически к любым средствам разработки vs7,6. может dot.net ето делает???)...
RH> если кто знает какои то open sourse project на ету тему поделитесь ссилочкои
RH>спасибо

1. Microsoft Visual Studio .NET точно умеет — сам видел
2. Mozilla. Имеет JavaScript Console + DOM Inspector
3. А можно и самому сделать дебаггер (для любителей всё сделать своими руками) :

например, вот такой:

/**
* Класс jsDump для отладки
*
* @author Mikhail Stadnik aka }|{yK <root@autoweb.ws>
* @copyright (c) 2004
*/
function jsDump() {
    this.strDump = '';
    this.wnd = window.open( 'about:blank');
}

/**
* Делает "мгновенный снимок" HTML. 
* Это может быть полезно когда мы динамически изменяем
* HTML страницы и хотим посмотреть, на чо он похож в какой то определенный момент.
*/
jsDump.prototype.dumpHTML = function() {
    if (navigator.appName == 'Netscape') {
        this.strDump = '<HTML>' + document.getElementsByTagName( 'HTML').item(0).innerHTML + '</HTML>';
    } else {
        this.strDump = document.getElementsByTagName( 'HTML').item(0).outerHTML;
    }
    this.wnd.document.write( '<pre style="font-family: Courier;">' + this.strDump.html2view() + '</pre><HR size="1px">');
    this.strDump = '';
}

/**
* Распечатывает переменную. 
* Нужно отнестись с пониманием к работе данной функции и учитывать,
* что она абсолютно бесполезна в тех случаяк, когда с ёё помощью производится
* попытка "отдампить" объект, содержащий рекурсивные ссылки объектов на самих себя 
* (эт такие объекты, как window, document, document.body и т.п.), так как это приведет
* к stack overflow at line xxx, потому что мы никак не сможем выйти из рекурсии
* Зато можеть быть полезной при попытке "отдампить" какие-то свои объекты, или,
* например, такой объект, как document.body.style
*
* З.Ы. Виду позднего времени (безумно хочется спать) нет желания сию минуту решить
* проблемму с рекурсией объектов. Возможно оно не появится и завтра :) Поэтому
* буду благодарен, если кто-то своим наметанным глазом увидит и подскажет всем остальным,
* как обойти данную проблемму...
*/
jsDump.prototype.dumpVar = jsDump_dumpVar;
function jsDump_dumpVar( _var, rem) {
    this.strDump += '<i style="color: #0000FF;">' + typeof( _var) + '</i> <b>=</b> ';
    switch ( typeof(_var)) {
        case 'object': {
            this.strDump += ' {<blockquote>';
            for (var i in _var) {
                this.strDump += '[<b>' + i + '</b>] ';
                this.dumpVar( _var[i], true);
            }
            this.strDump += '</blockquote>}<br>';
            break;
        }
        default: {
            var addStr = typeof( _var) == 'string' ? '&quot;' : '';
            this.strDump += addStr + _var.toString().html2view() + addStr + '<br>';
            break;
        }
    }
    if (!rem) {
        this.wnd.document.write( '<pre style="font-family: Courier;">' + this.strDump + '</pre><hr size="1px">');
        this.strDump = '';
    }
}

/**
* А это просто безумно хитрая приблуда :D 
* Угадайте - что она делает?
*/
String.prototype.html2view = function() {
    return this.replace( /&/g, '&amp;').replace( /</g, '&lt;').replace( />/g, '&gt;');
}

// Пример использования
var var1 = 'Blablabla';
var var2 = new Array(1, 2, 3, 4, 5, 6, 7, 'Blablabla');
var var3 = new Object();
var3.gg = var2;
var3.rr = 'Hahaha';
var3.cc = 4.236;
var3.ii = 456875;
var dd = new jsDump();
dd.dumpVar( var1);
dd.dumpVar( var2);
dd.dumpVar( var3);
dd.dumpVar( document.body.style);
dd.dumpHTML();


Думаю, что alert() + jsDump в большинстве случаев будет достаточно (если под рукой не оказалось путёвого дебаггера)
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[2]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 18.04.04 02:49
Оценка:
Вот наваял новую версию, в которой устранен глюк с рекурсией объектов
В принципе, мне самому даже понравилось Очень удобно тем, что этот дебагер не привязан к какому-то браузеру. Правда тестил только в ИЕ 6 и Мозилла 1.6. Так вот дампим одно и то же но в разных браузерах — сразу же можно искать отличия, посмотреть какие свойства, методы и т.п. присущи одному и тому же объекто в одном браузере, какие в другом...

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

Исходник дебагерра:

/**
* Класс jsDump для отладки
*
* @author Mikhail Stadnik aka }|{yK <root@autoweb.ws>
* @copyright (c) 2004
*/
function jsDump() {
    this.wnd = window.open( '');
    this.doc = this.wnd.document;
    this.entries = new Array();
    this.pre = this.doc.createElement( 'PRE');
    this.doc.body.appendChild( this.pre);
    this.variable = null;
    this.dumpString = new String();
}

/**
* Распечатывает переменную. 
* Дампит все возможные переменные. Если в переменной есть вложенность 
* объектов - дампит по частям, требует от пользователя инициализации
* распечатки следующего блока
*/
jsDump.prototype.dumpVar = jsDump_dumpVar;
function jsDump_dumpVar( variable, oEntryPoint, name) {
    var oEntryPoint = oEntryPoint || this.pre;
    var oCaption = this.doc.createElement( 'SPAN');
    oEntryPoint.appendChild( oCaption);
    switch (typeof( variable)) {
        case 'object': {
            var idPrfx = this.entries.length;
            var eI = this.doc.createElement( 'I');
            eI.style.color = "navy";
            eI.appendChild( this.doc.createTextNode( typeof( variable) + " "));
            oCaption.appendChild( eI);
            var eB = this.doc.createElement( 'B');
            eB.appendChild( this.doc.createTextNode( (name ? name : variable) + " = "))
            oCaption.appendChild( eB);
            if (variable != null) {
                oCaption.appendChild( this.doc.createTextNode( "{"));
                var oBlock = this.doc.createElement( "BLOCKQUOTE");
                oBlock.setAttribute( 'id', 'oBlock' + idPrfx);
                this.entries[idPrfx] = oBlock.getAttribute( 'id');
                oCaption.setAttribute( 'id', 'oCaption' + idPrfx);
                oCaption.style.cursor = navigator.appName == 'Netscape' ? 'pointer' : 'hand';
                oEntryPoint.appendChild( oBlock);
                oEntryPoint.appendChild( this.doc.createTextNode( "}"));
                oEntryPoint.appendChild( this.doc.createElement( "BR"));
                var __js__dd = this;
                oCaption.onclick = function() {
                    for (var i in variable) {
                        __js__dd.dumpVar( variable[i], oBlock, i);
                    }
                    this.style.cursor = '';
                    this.style.backgroundColor = '#EEEEEE';
                    this.onclick = '';
                }
            } else {
                var oBlock = this.doc.createTextNode( variable);
                oEntryPoint.appendChild( oBlock);
                oEntryPoint.appendChild( this.doc.createElement( "BR"));
            }
            break;
        }
        default: {
            var eI = this.doc.createElement( 'I');
            eI.style.color = "navy";
            eI.appendChild( this.doc.createTextNode( typeof( variable) + " "));
            oEntryPoint.appendChild( eI);
            var eB = this.doc.createElement( 'B');
            eB.appendChild( this.doc.createTextNode( name + " = "))
            oEntryPoint.appendChild( eB);
            oEntryPoint.appendChild( this.doc.createTextNode( variable));
            oEntryPoint.appendChild( this.doc.createElement( "BR"));
            break;
        }
    }
}

/**
* Делает "мгновенный снимок" HTML. 
* Это может быть полезно когда мы динамически изменяем
* HTML страницы и хотим посмотреть, на чо он похож в какой то определенный момент.
*/
jsDump.prototype.dumpHTML = function() {
    if (navigator.appName == 'Netscape') {
        this.dumpString = '<HTML>' + document.getElementsByTagName( 'HTML').item(0).innerHTML + '</HTML>';
    } else {
        this.dumpString = document.getElementsByTagName( 'HTML').item(0).outerHTML;
    }
    this.pre.appendChild( this.doc.createElement( 'HR'));
    this.pre.appendChild( this.doc.createTextNode( this.dumpString));
    this.dumpString = '';
}

// Пример использования
var dd = new jsDump();
dd.dumpVar( document);
dd.dumpHTML();
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[3]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 19.04.04 10:35
Оценка:
Так как со временем всплывают всякие глюки, исходники меняются.
На свежую версию исходников вы можете посмортеть здесь
Для того, чтобы скачать исходники жмите сюда
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[4]: javascript debuger на javascript
От: uzzy Россия  
Дата: 20.04.04 18:33
Оценка: 9 (1)
Здравствуйте, ЖуК, Вы писали:

ЖуК>Так как со временем всплывают всякие глюки, исходники меняются.

ЖуК>На свежую версию исходников вы можете посмортеть здесь
ЖуК>Для того, чтобы скачать исходники жмите сюда

Слегка поколдовал над твоим творением.
1. Сделал наглядное (цветовое) выделение раскрываемых нодов
2. Сделал сворачивание, разворачивание нодов.

Забрать можно отсюда
RSDN@Home 1.1.3 stable
Re[5]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 21.04.04 05:29
Оценка: +1
Здравствуйте, uzzy, Вы писали:

U>Слегка поколдовал над твоим творением.


Спасибо, uzzy! Если честно, я как раз и надеялся на то, что кто-то подхватит идею — она не так уж и бесполезна!

З.Ы. Я обновил исходники у себя, так что все теперь могут посмотреть на них, ссылки были приведены в предыдущих постах. Для очень ленивых напомню.

Пример здесь
Исходник здесь
Качать отсюда или отсюда
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[5]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 21.04.04 05:53
Оценка:
Здравствуйте, uzzy, Вы писали:

U>Слегка поколдовал над твоим творением.

U>1. Сделал наглядное (цветовое) выделение раскрываемых нодов
U>2. Сделал сворачивание, разворачивание нодов.

U>Забрать можно отсюда


Я немного переделал так, чтобы работало в Mozilla. Все ссылки в предыдущем посте
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[6]: javascript debuger на javascript
От: uzzy Россия  
Дата: 21.04.04 06:39
Оценка:
Здравствуйте, ЖуК, Вы писали:

ЖуК>Спасибо, uzzy! Если честно, я как раз и надеялся на то, что кто-то подхватит идею — она не так уж и бесполезна!

я то и ее подхватил, когда под рукой было только notepad, и отлаживать alert-ами задолбался . В общем если у меня еще появятся идеи, то реализация за мной не застоит.
Re[6]: javascript debuger на javascript
От: anonymous Россия http://denis.ibaev.name/
Дата: 21.04.04 07:04
Оценка: 16 (2)
Здравствуйте, ЖуК, Вы писали:

ЖуК>Я немного переделал так, чтобы работало в Mozilla. Все ссылки в предыдущем посте


кстати, в Mozilla этод:
if (!this.doc.body) {
    this.doc.body = this.doc.createElement( 'BODY');
    this.doc.getElementsByTagName( 'HTML').item(0).appendChild( this.doc.body);
}

можно заменить этим:
this.doc.open();
this.doc.close();

тогда минимальный документ будет создан автоматически, соответственно там будет и пустой <body>... возможно это прокатит и в других браузерах — не проверял...
Re[6]: javascript debuger на javascript
От: anonymous Россия http://denis.ibaev.name/
Дата: 21.04.04 07:57
Оценка: 20 (3)
Здравствуйте, ЖуК, Вы писали:

ЖуК>З.Ы. Я обновил исходники у себя, так что все теперь могут посмотреть на них, ссылки были приведены в предыдущих постах. Для очень ленивых напомню.


ЖуК>Пример здесь

ЖуК>Исходник здесь
ЖуК>Качать отсюда или отсюда

есть такая идея (проверил — работает):
в bookmark'ах создается закладка со следующим содержанием:
javascript:var v=window.prompt();var dd=new jsDump();dd.dumpVar(eval(v));

тогда если в отлаживаемую страницу вставить скрипт:
...
<script language="JavaScript" type="text/javascript" src="/path/to/jsdump.js">
...

при нажатии на эту закладку появится окошко с приглашением ввести имя переменной/объекта, и далее, после ввода, отобразится дамп этой переменной/объекта... по моему весьма удобно...

я думаю скрипт в закладке можно даже переработать так, что саму в саму страницу ничего не нужно будет дописывать... а скрипт будет присоединяться динамически...
Re[7]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 21.04.04 08:04
Оценка:
Здравствуйте, anonymous, Вы писали:

[skiped]

A>тогда минимальный документ будет создан автоматически, соответственно там будет и пустой <body>... возможно это прокатит и в других браузерах — не проверял...


Спасибо, anonymous! Правда в Опере упорно не желает работать ни так, ни так...

В дополнение добавлю, что кроме изменения, предложенного товарищем anonymous я сделал возможность не показывать переменные, которые равны null || undefined, и так теперь по-умолчанию
Появилось свойство jsDump::showEmpty и метод jsDump::showEmptyVars( needShow), который как раз и предназначен для того, чтобы задавать это свойство
Мало того, метод jsDump::dumpVar() вторым параметром теперь тоже принимает флаг showEmpty приоритет которого будет выше, чем у jsDump::showEmpty
Таким образом мы можем теперь управлять выводом нулл переменных (зачастую они не нужны и скорость отработки без их вывода увеличивается)
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[7]: javascript debuger на javascript
От: anonymous Россия http://denis.ibaev.name/
Дата: 21.04.04 08:50
Оценка:
вот код закладки с подгрузкой скрипта, если его нет на странице:
javascript:var w=window;if (w.jsDump==undefined){var d=w.document;var s=d.createElement('script');s.src='http://scripts.kiev.ua/scripts/jsdump.js';d.body.appendChild(s)};var v=w.prompt('Enter object name:');var dd=new jsDump();dd.dumpVar(eval(v));

но есть проблема, если скрипт не успел подгрузиться, то будет ошибка... ищем решение...

P.S. Жук, ничего что скрипт пользователи с твоего сайта подгружать будут?...
Re[8]: javascript debuger на javascript
От: King Oleg Украина http://kingoleg.livejournal.com
Дата: 21.04.04 09:03
Оценка: +1 :)
Здравствуйте, anonymous, Вы писали:


A>вот код закладки с подгрузкой скрипта, если его нет на странице:

A>
A>javascript:var w=window;if (w.jsDump==undefined){var d=w.document;var s=d.createElement('script');s.src='http://scripts.kiev.ua/scripts/jsdump.js';d.body.appendChild(s)};var v=w.prompt('Enter object name:');var dd=new jsDump();dd.dumpVar(eval(v));
A>

A>но есть проблема, если скрипт не успел подгрузиться, то будет ошибка... ищем решение...

Решения:
1. В конце скрипта выставляем глобальную переменную. В закладке в цикле проверяем ее на существование
2. Все, что должно вызыватся после загрузки скрипта ложим в функцию. В скрипте в конце ее вызываем.
3. В цикле после начала загрузки скрипта проверяем его состояние.

A>P.S. Жук, ничего что скрипт пользователи с твоего сайта подгружать будут?...
King Oleg
*Читайте DOC'и, они rules*
Re[8]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 21.04.04 09:05
Оценка:
Здравствуйте, anonymous, Вы писали:


A>вот код закладки с подгрузкой скрипта, если его нет на странице:

A>
A>javascript:var w=window;if (w.jsDump==undefined){var d=w.document;var s=d.createElement('script');s.src='http://scripts.kiev.ua/scripts/jsdump.js';d.body.appendChild(s)};var v=w.prompt('Enter object name:');var dd=new jsDump();dd.dumpVar(eval(v));
A>


A>но есть проблема, если скрипт не успел подгрузиться, то будет ошибка... ищем решение...


Решаем проблемму

javascript:var w=window; if (w.jsDump==undefined){var d=w.document;var s=d.createElement('script');s.src='http://scripts.kiev.ua/scripts/jsdump.js';d.body.appendChild(s)}; while(!JS_DUMP_LOADED) { try { var dd=new jsDump(); } catch(err) { continue; }} var v=w.prompt('Enter object name:'); dd.dumpVar(eval(v));


Только протестить сейчас не могу... Вообщем такова идея, возможно при реализации нужно будет добавить задержку по времени в цикл...
Намекни, если заработает

A>P.S. Жук, ничего что скрипт пользователи с твоего сайта подгружать будут?...


Ничего страшного — все нормально
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[9]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 21.04.04 09:08
Оценка:
Здравствуйте, King Oleg, Вы писали:

KO>Решения:

KO>1. В конце скрипта выставляем глобальную переменную. В закладке в цикле проверяем ее на существование
KO>2. Все, что должно вызыватся после загрузки скрипта ложим в функцию. В скрипте в конце ее вызываем.
KO>3. В цикле после начала загрузки скрипта проверяем его состояние.

Клево, пока ты писал идею я писал ее реализацию и чуть позже тебя запостил — бывает же так
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[4]: [wish] javascript debuger на javascript
От: anonymous Россия http://denis.ibaev.name/
Дата: 21.04.04 10:17
Оценка:
есть предложение: в дампе значения объектов String заключать в кавычки для наглядности...
Re[5]: [wish] javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 21.04.04 10:22
Оценка:
Здравствуйте, anonymous, Вы писали:


A>есть предложение: в дампе значения объектов String заключать в кавычки для наглядности...


No problem! Пользуйтесь наздоровье
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[8]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 21.04.04 11:16
Оценка:
Здравствуйте, anonymous, Вы писали:

A>но есть проблема, если скрипт не успел подгрузиться, то будет ошибка... ищем решение...


Уже нету проблемы. Вот код, который все решает:

javascript:var w=window;var JS_DUMP_LOADED;if (w.jsDump==undefined){var d=w.document;var s=d.createElement('script');s.src='http://scripts.kiev.ua/scripts/jsdump.js';d.body.appendChild(s)};var oInterval;function onScriptLoad(){if(JS_DUMP_LOADED){var v=w.prompt( 'Enter object name:', '');if(v){var dd=new jsDump();dd.dumpVar(eval(v));}clearInterval(oInterval);}else{oInterval=setInterval("onScriptLoad()", 1000);}};onScriptLoad();


Проверено в Mozilla 1.6, IE 6.0
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[9]: javascript debuger на javascript
От: ЖуК Украина http://smart-ip.net/
Дата: 21.04.04 11:33
Оценка:
A>>но есть проблема, если скрипт не успел подгрузиться, то будет ошибка... ищем решение...

ЖуК>Уже нету проблемы. Вот код, который все решает:


Хотя с практической точки зрения эта фича нифиг не нужна
Потому что нам нужно дампить нечто в какой-то момент, а в данном случае мы дампим конечный результат. Хотя ингода и это нужно...
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.