Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding rows dynamically with jQuery

I'm building a form where I need multiple optional inputs, what I have is basically this:

form example

Every time a user presses the plus button a new row of form inputs should be added to the form, how can I do this in jQuery? Also, is it possible to automatically add a new row when all rows (or just the last row, if it's easier / faster) are filled? That way the user wouldn't need to press the plus button.

I'm sorry for asking maybe such a basic question but I'm still very green with jQuery, I could do this with PHP but I'm sure Javascript / jQuery plays a more appropriate role here.

Thanks in advance!


@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> 
like image 722
Alix Axel Avatar asked Jan 27 '10 06:01

Alix Axel


2 Answers

This will get you close, the add button has been removed out of the table so you might want to consider this...

<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 markup looks like this

  <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 To empty a value of a textbox after insert..

    $('#mytable tbody>tr:last').clone(true).insertAfter('#mytable tbody>tr:last');     $('#mytable tbody>tr:last #name').val('');     return false; 

EDIT2 Couldn't help myself, to reset all dropdown lists in the inserted TR you can do this

$("#mytable tbody>tr:last").each(function() {this.reset();});            

I will leave the rest to you!

like image 147
Rippo Avatar answered Oct 01 '22 13:10

Rippo


As an addition to answers above: you probably might need to change ids in names/ids of input elements (pls note, you should not have digits in fields name):

<input name="someStuff.entry[2].fieldOne" id="someStuff_fdf_fieldOne_2" ..> 

I have done this having some global variable by default set to 0:

var globalNewIndex = 0; 

and in the add function after you've cloned and resetted the values in the new row:

                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++; 
like image 26
javagirl Avatar answered Oct 01 '22 12:10

javagirl