Добавление строки в таблицу
Всем привет. Не силён в js, потому для реализации своей задачи (добавление строки в таблицу) надыбал на просторах интернета следующий скрипт:
<script> var c=0; //счётчик количества строк function addline() { c++; // увеличиваем счётчик строк s=document.getElementById('table').innerHTML; // получаем HTML-код таблицы s=s.replace(/[\r\n]/g,''); // вырезаем все символы перевода строк re=/(.*)(<tr id=.*>)(<\/table>)/gi; // это регулярное выражение позволяет выделить последнюю строку таблицы s1=s.replace(re,'$2'); // получаем HTML-код последней строки таблицы s2=s1.replace(/\[\d+\]/gi,'['+c+']'); // заменяем все цифры к квадратных скобках // на номер новой строки s2=s2.replace(/(rmline\()(\d+\))/gi,'$1'+c+')'); // заменяем аргумент функции rmline на номер новой строки s=s.replace(re,'$1$2'+s2+'$3'); // создаём HTML-код с добавленным кодом новой строки document.getElementById('table').innerHTML=s; // возвращаем результат на место исходной таблицы return false; // чтобы не происходил переход по ссылке } function rmline(q) { if (c==0) return false; else c--; // если раскомментировать предыдущую строчку, то последний (единственный) // элемент удалить будет нельзя. s=document.getElementById('table').innerHTML; s=s.replace(/[\r\n]/g,''); re=new RegExp('<tr id="?newline"? nomer="?\\['+q+'.*?<\\/tr>','gi'); // это регулярное выражение позволяет выделить строку таблицы с заданным номером s=s.replace(re,''); // заменяем её на пустое место document.getElementById('table').innerHTML=s; return false; } </script> Сама форма: <form> <span id="table"> <table border=1 cellspacing=0 cellpadding=3> <tr> <td>Поле раз</td> <td>Поле два</td> <td>Поле три</td> <td><a href="#" onclick="return addline();"><span style="color:red; font-size:36px; text-align:center;">+</span></a></td> </tr> <tr id="newline" nomer="[0]"> <td><input type="text" name="field1[0]" style="width: 50px;"></td> <td><input type="text" name="field2[0]" style="width: 50px;"></td> <td><input type="text" name="field3[0]" style="width: 50px;"></td> <td valign="top"><a href="#" onclick="return rmline(0);">удалить</a></td> </tr> </table> </span> <input type="submit"> </form> Все работает, строки добавляются по нажатию "+", но с одним неприятным деффектом - стираются уже заполненные поля. Т.е. нажав "+" в данной форме: http://prntscr.com/clqopm Получу следующее: http://prntscr.com/clqovj Помогите побороть это недоразумение. Заранее спасибо. |
Таблицу в span уже плохо. Рег. выражения тут лишнее. Стили из тегов убрать. Не надо ни каких номеров полям, индексы будет проставлены автоматически согласно порядку полей в форме. На jQuery:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> #tbl { border-collapse: collapse; } #tbl td { border: 1px solid #ddd; padding: 4px; } #tbl input { width: 50px; } a.delRow, #addRow { display: block; cursor: pointer; } </style> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script> $(function() { $('#addRow').click(function() { var t = $('#tbl'); t.find('tr') .eq(1) .clone() .appendTo(t) .find('td:last') .append('<a class="delRow">удалить</a>') .end() .find('input') .val(''); }); $('#tbl').on('click', 'a.delRow', function() { $(this).closest('tr').remove(); }); }); </script> </head> <body> <form> <table id="tbl"> <tr> <td>Поле раз</td> <td>Поле два</td> <td>Поле три</td> <td><a id="addRow">+</a></td> </tr> <tr> <td><input type="text" name="field1[]" /></td> <td><input type="text" name="field2[]" /></td> <td><input type="text" name="field3[]" /></td> <td></td> </tr> </table> <input type="submit"/> </form> </body> </html> |
Цитата:
|
laimas, огромное спасибо за код.
В приведенном примере поля input были для примера, в реальности использую так же textarea. Изменил чутка скрипт: <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script> $(function() { $('#addRow').click(function() { var t = $('#tbl'); t.find('tr') .eq(1) .clone() .appendTo(t) .find('td:last') .append('<a class="delRow">удалить</a>') .end() .find('textarea') .val('') .end() .find('input') .val(''); }); $('#tbl').on('click', 'a.delRow', function() { $(this).closest('tr').remove(); }); }); </script> Всё работает великолепно. Ещё раз огромное спасибо. 2 warren buffet Изначальная ЗАДАЧА была в создании динамической формы ибо количество полей неизвестно. Реализацию ЗАДАЧИ нашёл в интернете, но возникли сложности описанные в первом посте. Потому потребовалась помощь в реализации изменений в готовой реализации изначально поставленной задачи. Что, само по себе, и является задачей. Не? :) |
visajack,
таблица все таки для табличных данных, а форматировать элементы в форме можно более легкими средствами. Ищите в сети, там много пример по данному вопросу. |
visajack, нет таких динамических форм. Твоя задача называется
datagrid а форма не нужна, поскольку ты все равно используешь жабу скрипучую. В datagrid поля не размножаются, а просто подставляются в строку, куда юзер щелкнул. Ладно, не важно, посмотри как делают по словам datagrid javascript в гугле. |
Цитата:
Datagrid - элемент управления. Управлять можно любыми табличными данными. Если хочешь по 100500 раз не переписывать свою бнопню, колись, что делаешь и может быть оно в 100500-й раз уже сделано и надо просто пойти, скачать и себе приклеить. |
Часовой пояс GMT +3, время: 03:31. |