За последние 24 часа нас посетили 19362 программиста и 1628 роботов. Сейчас ищут 1093 программиста ...

добавить tr в таблицу.

Тема в разделе "JavaScript и AJAX", создана пользователем RomanBush, 25 фев 2008.

  1. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Плохо знаю жабускрипт, поэтому спрашиваю.
    Есть таблица. Обыкновенная.
    HTML:
    1.   <tr id="s1">
    2.     <td>&nbsp;</td><td>&nbsp;</td>
    3.   </tr>
    4.   <tr id="s2">
    5.     <td>&nbsp;</td><td>&nbsp;</td>
    6.   </tr>
    Как можно динамически вставить между "s1" и "s2" ещё строки. То есть -
    HTML:
    1. <tr id="s3">
    2.   <td>&nbsp;</td><td>&nbsp;</td>
    3. </tr>
    :?:
    Пробовал так:
    [js] newtr=document.createElement("tr");
    newtr.innerHTML='<tr><td>&nbsp;</td><td>&nbsp;</td></tr>';[/js]
    а вот дальше - не пойму, что надо сделать. Дальше
    x=document.getElementById('s2'); - мысль не идёт.
     
  2. Anonymous

    Anonymous Guest

    а так и не вставится, по моему... в сам DOM не войдет новая строка.
     
  3. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    [js]document.getElementById('s2').parentNode.insertBefore(newtr, document.getElementById('s2'));[/js]
     
  4. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    вот про parentNode - я не знал, поэтому у меня и не получалось insertBefore.
    Спасибо, теперь понял смысл конструкции.
     
  5. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
  6. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    А за ссылки - отдельное спасибо. Сам замучался искать нормальные руководства. А метод "научного тыка" надоел до смерти.
     
  7. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Не работает - не встраивается. Всё, что ниже - смещается на один пиксель вниз и всё. Новый tr на экране не появляется.
     
  8. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    RomanBush
    А в итоге что получается (код исходный)?
     
  9. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Место, где надо вставить:
    HTML:
    1. <tr id="befor">
    2. <td>
    3. <p>&nbsp;</p>
    4. </td>
    5. <td>
    6. <p>&nbsp;</p>
    7. </td><td></td>
    8. </tr>
    Процесс вставки:

    [js] newnode=document.createElement("tr");
    newtext= '<tr><td>&nbsp;</td><td><p><b>ТЕКСТ</b></p></td><td>&nbsp;</td></tr>';
    newnode.innerHTML=newtext;
    document.getElementById('befor').parentNode.insertBefore(newnode,document.getElementById('befor'));[/js]
    Форматирование и текст убрал.
    Эта же схема с div'ами - работает. Создал быстренько несколько дивов, попробовал insertBefore - на экране отображается так, как нужно. Но мне нужно именно tr вставить. А с ними не получается.
    Я не совсем понимаю смысл строки newnode=document.createElement("tr"); - если я потом делаю newnode.innerHTML='<tr>...</tr>';
    Попробовал поиграться - вместо "tr" писал разное, начиная от span, div, до бреда. В результате понял так, что новую строку (tr) он таки вставляет, но на экран её не показывает. Потому что только при createElement('tr') есть эффект, что всё, что ниже места вставляния - сдвигается на миллиметр вниз. При всех остальных вариантах - либо синтаксич. ошибка, либо на экране ничего не происходит.
     
  10. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    RomanBush
    Я имел ввиду, что стоит посмотреть исходный код документа после операции вставки этого самого tr. Чтобы наглядно посмотреть, а что же получилось :)

    Я, честно, тоже не понимаю, зачем в строке innerHTML еще раз указываются tr. innerHTML - это же то, что внутри тега, т.е. внутри tr.


    HTML:
    1.     <title>Row insert example</title>
    2.     <style type="text/css">
    3.         table {
    4.             empty-cells: show;
    5.         }
    6.         td {
    7.             border: 1px solid red;
    8.             padding: 50px;
    9.         }
    10.     </style>
    11.     <script type="text/javascript" src="js/core.js"></script>
    12. </head>
    13.  
    14.     <tr id="s1">
    15.         <td></td><td></td>
    16.     </tr>
    17.     <tr id="s2">
    18.         <td></td><td></td>
    19.     </tr>
    20.  
    21.  
    22. <script type="text/javascript">
    23.     var tr = create_element(null, 'tr');
    24.     create_txt(create_element(tr, 'td'), 'cell 1');
    25.     create_txt(create_element(tr, 'td'), 'cell 2');
    26.     $('s2').parentNode.insertBefore(tr, $('s2'));
    27.  
    28. </body>
    29. </html>
    Сорри, что с лишними функциями, но я уже без них никак не могу :)
    Вот необходимый кусок core.js:
    [js]/* Сокращение document.getElementById */
    function $(id) {
    return document.getElementById(id);
    }


    /* Создает текстовый нод с содержанием content */
    function create_txt(parent, content) {
    var txt = document.createTextNode(content);
    parent.appendChild(txt);

    return txt;
    }


    /* Создает элемент name с атрибутами atts
    * Если parent != null добавляет к нему элемент
    */
    function create_element(parent, name, atts) {
    var el = document.createElement(name);
    for (var aname in atts)
    el.setAttribute(aname, atts[aname]);

    if (parent != null)
    parent.appendChild(el);

    return el;
    }[/js]
     
  11. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    То есть - получается, что мало создать <tr> и сказать ему innerHTML= а надо ещё и все td'шники к нему прикрутить?
    Мать...мать...мать.... откликнулось эхо.
    Спасибо за подсказку.
    Вот теперь у меня в голове модель этой таблицы уложилась. Кажется. Может быть. Ща поэксперементирую.
     
  12. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Либо одно, либо другое… Первое - это чистый DOM, второе - небольшой хак со стороны браузеропроизводителей для облегчения жизни.
     
  13. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Опять не понял. Этот же вариант не работает в случае с таблицами? Или я что-то не так делаю/не понимаю?
     
  14. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    RomanBush
    HTML:
    1.  
    2. <tr id="sds">
    3. <td>123</td>
    4. </tr>
    5. <button onclick="document.getElementById('sds').innerHTML += '<td>123</td>'">+1</button>
    6.  
    В ИЕ выдаёт runtime error. В мозиле всё нормально. Сам недавно наткнулся на это. Видно, какие-то проблемы с innerHTML в <TR>.
     
  15. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Я же привел пример на чистом DOM.

    Вот пример с innerHTML:
    HTML:
    1.     <title>Row insert example</title>
    2.     <style type="text/css">
    3.         table {
    4.             empty-cells: show;
    5.         }
    6.         td {
    7.             border: 1px solid red;
    8.             padding: 50px;
    9.         }
    10.     </style>
    11.     <script type="text/javascript" src="js/core.js"></script>
    12. </head>
    13.  
    14.     <tr id="s1">
    15.         <td></td><td></td>
    16.     </tr>
    17.     <tr id="s2">
    18.         <td></td><td></td>
    19.     </tr>
    20.  
    21.  
    22. <script type="text/javascript">
    23.     var tr = document.createElement('tr');
    24.     $('s2').parentNode.insertBefore(tr, $('s2'));
    25.     tr.innerHTML = '<td>cell 1</td><td>cell 2</td>';
    26.  
    27. </body>
    28. </html>
     
  16. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    AlexGousev
    В вашем примере в ИЕ - "unknow runtime error". Не знаете, почему так? Баг браузера, или просто innerHTML в <tr> - это не по стандартам?
     
  17. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
  18. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Не работает. Тоже самое, что и у меня получалось - сдвигается всё, что ниже, на один пиксел, а новые строки не показываются. К тому же пишет "неизвестная ошибка выполнения". Если поменять местами последнии две строчки - то ошибку не пишет, но выводить всё равно не выводит.
    У меня IE6.
     
  19. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    RomanBush
     
  20. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0