ФорумПрограммированиеJavaScript → Аналог var_export ?

Аналог var_export ?

  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 13 сентября 2010 г. 20:50

    Подскажите как в JS красиво вывести произвольные данные (отладка) чтобы не тупо писала "object", а попыталась развернуть массив скажем. В PHP я пользую var_export или var_dump, а здесь как?
    Прошу jQuery + плагины не предлагать. Что-нибудь простое.

    Типа:

    document.write(mydump(data));

    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 13 сентября 2010 г. 20:59, спустя 8 минут 45 секунд

    artoodetoo, напиши mydump и выложи тут заодно :)

    я обычно делаю console.log - от файрбага консоль и там уже просматриваю "дерево" объекта
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 13 сентября 2010 г. 21:00, спустя 1 минуту 19 секунд

    phpdude, я то надеялся, что ты уже написал mydump() )))
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 13 сентября 2010 г. 21:02, спустя 1 минуту 48 секунд

    artoodetoo, люблю когда меня спрашивают прилюдно, мог в личку спросить ))))))))))) неа не написал, думал пару раз, да обошелся firebug консолью
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 13 сентября 2010 г. 22:43, спустя 1 час 40 минут 33 секунды


    function dump(varval, varname)
    {
    var text = '';
    var padding = '';

    if (typeof(dump.level) == 'undefined') dump.level = 0;
    dump.level++;
    for(var j = 1; j < dump.level; j++) padding += &#39; &#39;;

    text = padding;
    if (typeof(varname) != &#39;undefined&#39;) {
    text += &#39;&quot;&#39; + varname + &#39;&quot;&#39; + &#39;: &#39;;
    }

    if (typeof(varval) == &#39;object&#39;) {
    text += &#39;{\n&#39;;
    for (var key in varval) {
    var val = varval[key];
    text += dump(val, key);
    }
    text += padding + &#39;},\n&#39;;
    } else {
    text += &#39;&quot;&#39; + varval + &#39;&quot;&#39; + &#39;,\n&#39;;
    }

    dump.level–;
    return text;
    }
    ιιlllιlllι унц-унц
  • mario

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 13 сентября 2010 г. 22:58, спустя 15 минут 12 секунд

    в мемориз! :)
    А то порой заебывает консоле.лог ))) {+++7+++} спасибо!
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 13 сентября 2010 г. 23:29, спустя 31 минуту 6 секунд

    велосипед:
    сохраняем дебугинфу в формате json

    <?php

    class QbApp
    {

    function end()
    {
       $time  = microtime(TRUE);
       $start = Qb::get(&#39;start&#39;);

       $data = array(
           &#39;request&#39; => $_SERVER[&#39;REQUEST_METHOD&#39;] . &#39;:&#39; . $_SERVER[&#39;REQUEST_URI&#39;],
           &#39;at&#39;      => gmdate(&#39;r&#39;, $start),
           &#39;time&#39;    => $time - $start,
           &#39;log&#39;     => QbLog::get(),
       );

       $fileName = dirname(__FILE__) . &#39;/../log/&#39; . $start . &#39;.txt&#39;;
       file_put_contents($fileName, json_encode($data));
    }

    }


    Где-то в шаблоне выводится ссылка на viewdebug.php?id=xxx
    а вот viewdebug.php

    <?php

    if (!isset($_GET[&#39;id&#39;]) || strspn($_GET[&#39;id&#39;], &#39;1234567890.&#39;) != strlen($_GET[&#39;id&#39;])) {
       die(&#39;Wrong id&#39;);
    }

    $file = &#39;./log/&#39;.$_GET[&#39;id&#39;].&#39;.txt&#39;;
    if (!file_exists($file)) {
       die(&#39;Log not found&#39;);
    }
    $data = file_get_contents($file);

    ?>
    <script type=&quot;text/javascript&quot;>
    var data = <?php echo $data ?>;

    function dump(varval, varname)
    {
     var text = &#39;&#39;;
     var padding = &#39;&#39;;

     if (typeof(dump.level) == &#39;undefined&#39;) dump.level = 0;
     dump.level++;
     for(var j = 1; j < dump.level; j++) padding += &#39;  &#39;;

     text = padding;
     if (typeof(varname) != &#39;undefined&#39;) {
       text += &#39;&quot;&#39; + varname + &#39;&quot;&#39; + &#39;: &#39;;
     }

     if (typeof(varval) == &#39;object&#39;) {
       text += &#39;{\n&#39;;
       for (var key in varval) {
         var val = varval[key];
         text += dump(val, key);
       }
       text += padding + &#39;},\n&#39;;
     } else {
       text += &#39;&quot;&#39; + varval + &#39;&quot;&#39; + &#39;,\n&#39;;
     }

     dump.level–;
     return text;
    }

    </script>

    <h1>Debug info</h1>

    <script type=&quot;text/javascript&quot;>
    document.write(&#39;<b>Request</b>: &#39; + data[&#39;request&#39;] + &#39;<br/>\n&#39;);
    document.write(&#39;<b>At</b>: &#39; + data[&#39;at&#39;] + &#39;<br/>\n&#39;);
    document.write(&#39;<b>Exec. time</b>: &#39; + data[&#39;time&#39;] + &#39; sec<br/>\n&#39;);
    document.write(&#39;<h2>Log</h2><pre>&#39; + dump(data[&#39;log&#39;]) + &#39;</pre>&#39;);
    </script>



    fullsize screenshot
    результат
    ιιlllιlllι унц-унц
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 0:38, спустя 1 час 8 минут 54 секунды

    да ну нафиг, мне console.log() хватает… не люблю я лишние библиотеки встраивать
    adw/0
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 1:32, спустя 54 минуты 22 секунды

    хозяин барин. мне вот понадобилось
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 1:59, спустя 26 минут 57 секунд

    я js почти не трогаю, так, по крайней необходимости. в console.log мне не нравится, что эта штука везде кроме FF+FireBug будет порождать ошибку. а когда отлаживаешся, постоянно переключаешся FF->Opera->IE и по кругу. некузяво жить с ошибками
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 25 сентября 2010 г. 23:16, спустя 11 дней 21 час 16 минут

    UP

    Захотелось мне выводить время генерации страницы и всякие логи прямо на самой странице. Получил проблему курицы и яйца: в момент рендеринга страницы я еще не обладаю всей нужной инфой.

    Выручает JavaScript. Реальную инфу я могу сохранять во внешний файл в своем обработчике shutdown или в деструкторе объекта приложения, что один хрен.
    А во время рендеринга мне достаточно знать id этого сеанса. Браузер за меня обратится к js с отладочной инфой и через document.write() всё отрисует.


    <script type=&quot;text/javascript&quot; src=&quot;js/dump.js&quot;></script>
    <script type=&quot;text/javascript&quot; src=&quot;<?php echo $app->debugFile ?>&quot;></script>


    Здесь $app->debugFile имя файла с данными в формате JSON, имя включает в себя microtime() для уникальности.

    И никакого AJAX не понадобилось :)
    К.О. торжествуе!

    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 26 сентября 2010 г. 2:23, спустя 3 часа 7 минут 4 секунды

    а ведь можно повесить listener на отдачу ответа классом Response
    в теле handler&#39;а, который будет обрабатывать ответ будет находиться что-то типа
    str_ireplace(&#39;</body>&#39;, $toolbar . &#39;</body>&#39;, $response->getContent());
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 26 сентября 2010 г. 3:01, спустя 38 минут 6 секунд

    я не понял. или ты не понял
    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 26 сентября 2010 г. 3:15, спустя 13 минут 25 секунд

    Получил проблему курицы и яйца: в момент рендеринга страницы я еще не обладаю всей нужной инфой.

    после рендеринга но перед отдачей ответа пользователю проходишься поиском и заменой по телу ответа и вставляешь свои логи и время генерации (я в прошлом сообщении это показал).
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 26 сентября 2010 г. 3:42, спустя 27 минут 40 секунд

    здесь много &quot;если&quot;

    - да я написал &quot;рендеринг страницы&quot;, но не факт, что я буду отдавать html. а логи желательно сохранять в любом случае

    - смотря что я хочу замерить. в идеале я меряю время до exit(). в твоем случае - до конца работы шаблонизатора. это близко, но опять не факт. зависит от структуры приложения

    - кто сказал что у меня есть объект response и вообще что я в явную использую буферизацию

    слишком много зависимостей.
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!