Динамическое добавление строк с помощью jQuery
Я создаю форму, где мне нужно несколько дополнительных входов, что у меня в основном это:
пример формы http://i49.tinypic.com/fcscyh.png
каждый раз, когда пользователь нажимает кнопку Плюс, в форму должна быть добавлена новая строка входных данных формы, как я могу это сделать в jQuery? кроме того, можно автоматически добавить новую строку после всех строк (или просто последняя строка, если это проще / быстрее)заполнены? таким образом, пользователю не нужно будет нажимать кнопку "Плюс".
извините, что задаю такой простой вопрос, но я все еще очень зеленый с jQuery, я мог бы сделать это с PHP, но я уверен, что Javascript / jQuery играет здесь более подходящую роль.
спасибо заранее!
@alex:
<!DOCTYPE html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<script type="text/javascript">
$form = $('#personas');
$rows = $form.find('.person');
$('a#add').click(function() {
$rows.find(':first').clone().insertAfter($rows.find(':last'));
$justInserted = $rows.find(':last');
$justInserted.hide();
$justInserted.find('input').val(''); // it may copy values from first one
$justInserted.slideDown(500);
});
</script>
</head>
<body>
<form id="personas" name="personas" method="post" action="">
<table width="300" border="1" cellspacing="0" cellpadding="2">
<tr>
<td>Name</td>
<td>More?</td>
</tr>
<tr class="person">
<td><input type="text" name="name[]" id="name[]" /></td>
<td><a href="#" id="add">+</a></td>
</tr>
</table>
</form>
</body>
</html>
5 ответов:
Это позволит вам закрыть, кнопка Добавить была удалена из таблицы, так что вы можете рассмотреть это...
<script type="text/javascript"> $(document).ready(function() { $("#add").click(function() { $('#mytable tbody>tr:last').clone(true).insertAfter('#mytable tbody>tr:last'); return false; }); }); </script>
HTML разметка выглядит так
<a id="add">+</a></td> <table id="mytable" width="300" border="1" cellspacing="0" cellpadding="2"> <tbody> <tr> <td>Name</td> </tr> <tr class="person"> <td><input type="text" name="name" id="name" /></td> </tr> </tbody> </table>
EDIT чтобы очистить значение текстового поля после вставки..
$('#mytable tbody>tr:last').clone(true).insertAfter('#mytable tbody>tr:last'); $('#mytable tbody>tr:last #name').val(''); return false;
EDIT2 не смог удержаться, чтобы сбросить все выпадающие списки в вставленном TR вы можете сделать это
$("#mytable tbody>tr:last").each(function() {this.reset();});
остальное я оставлю тебе!
В дополнение к ответам выше: вам, вероятно, может потребоваться изменить идентификаторы в именах/идентификаторах входных элементов (обратите внимание, что у вас не должно быть цифр в имени полей):
<input name="someStuff.entry[2].fieldOne" id="someStuff_fdf_fieldOne_2" ..>
Я сделал это, имея некоторую глобальную переменную по умолчанию, равную 0:
var globalNewIndex = 0;
и в функции добавить после того, как вы клонировали и сбросили значения в новой строке:
var newIndex = globalNewIndex+1; var changeIds = function(i, val) { return val.replace(globalNewIndex,newIndex); } $('#mytable tbody>tr:last input').attr('name', changeIds ).attr('id', changeIds ); globalNewIndex++;
Я пробовал что-то вроде этого и его прекрасно работает;
это html часть:
<table class="dd" width="100%" id="data"> <tr> <td>Year</td> <td>:</td> <td><select name="year1" id="year1" > <option value="2012">2012</option> <option value="2011">2011</option> </select></td> <td>Month</td> <td>:</td> <td width="17%"><select name="month1" id="month1"> <option value="1">January</option> <option value="2">February</option> <option value="3">March</option> <option value="4">April</option> <option value="5">May</option> <option value="6">June</option> <option value="7">July</option> <option value="8">August</option> <option value="9">September</option> <option value="10">October</option> <option value="11">November</option> <option value="12">December</option> </select></td> <td width="7%">Week</td> <td width="3%">:</td> <td width="17%"><select name="week1" id="week1" > <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> </select></td> <td width="8%"> </td> <td colspan="2"> </td> </tr> <tr> <td>Actual</td> <td>:</td> <td width="17%"><input name="actual1" id="actual1" type="text" /></td> <td width="7%">Max</td> <td width="3%">:</td> <td><input name="max1" id="max1" type="text" /></td> <td>Target</td> <td>:</td> <td><input name="target1" id="target1" type="text" /></td> </tr>
Это Javascript часть;
<script src="http://code.jquery.com/jquery-latest.js"></script> <script type='text/javascript'> //<![CDATA[ $(document).ready(function() { var currentItem = 1; $('#addnew').click(function(){ currentItem++; $('#items').val(currentItem); var strToAdd = '<tr><td>Year</td><td>:</td><td><select name="year'+currentItem+'" id="year'+currentItem+'" ><option value="2012">2012</option><option value="2011">2011</option></select></td><td>Month</td><td>:</td><td width="17%"><select name="month'+currentItem+'" id="month'+currentItem+'"><option value="1">January</option><option value="2">February</option><option value="3">March</option><option value="4">April</option><option value="5">May</option><option value="6">June</option><option value="7">July</option><option value="8">August</option><option value="9">September</option><option value="10">October</option><option value="11">November</option><option value="12">December</option></select></td><td width="7%">Week</td><td width="3%">:</td><td width="17%"><select name="week'+currentItem+'" id="week'+currentItem+'" ><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option></select></td><td width="8%"></td><td colspan="2"></td></tr><tr><td>Actual</td><td>:</td><td width="17%"><input name="actual'+currentItem+'" id="actual'+currentItem+'" type="text" /></td><td width="7%">Max</td> <td width="3%">:</td><td><input name="max'+currentItem+'" id ="max'+currentItem+'"type="text" /></td><td>Target</td><td>:</td><td><input name="target'+currentItem+'" id="target'+currentItem+'" type="text" /></td></tr>'; $('#data').append(strToAdd); }); }); //]]> </script>
наконец PHP отправить часть:
for( $i = 1; $i <= $count; $i++ ) { $year = $_POST['year'.$i]; $month = $_POST['month'.$i]; $week = $_POST['week'.$i]; $actual = $_POST['actual'.$i]; $max = $_POST['max'.$i]; $target = $_POST['target'.$i]; $extreme = $_POST['extreme'.$i]; $que = "insert INTO table_name(id,year,month,week,actual,max,target) VALUES ('".$_POST['type']."','".$year."','".$month."','".$week."','".$actual."','".$max."','".$target."')"; mysql_query($que); }
вы можете найти более подробную информацию через динамический вставщик строк таблицы
непроверенными. Изменить в соответствии с требованиями:
$form = $('#my-form'); $rows = $form.find('.person-input-row'); $('button#add-new').click(function() { $rows.find(':first').clone().insertAfter($rows.find(':last')); $justInserted = $rows.find(':last'); $justInserted.hide(); $justInserted.find('input').val(''); // it may copy values from first one $justInserted.slideDown(500); });
Это лучше, чем копирование innerHTML, потому что вы потеряете все вложенные события и т. д.
основываясь на других ответах, я немного упростил вещи. Клонируя последний элемент, мы получаем кнопку" Добавить новый " бесплатно (вам нужно изменить идентификатор на класс из-за клонирования), а также уменьшить операции DOM. Мне пришлось использовать filter() вместо find (), чтобы получить только последний элемент.
$('.js-addNew').on('click', function(e) { e.preventDefault(); var $rows = $('.person'), $last = $rows.filter(':last'), $newRow = $last.clone().insertAfter($last); $last.find($('.js-addNew')).remove(); // remove old button $newRow.hide().find('input').val(''); $newRow.slideDown(500); });