33

I am trying to create dynamic form where user can add dynamic text-fields based on their requirement. Here is my jquery code ..

$(document).ready(function() {
    $("#add").click(function() {
        var intId = $("#buildyourform div").length +1;
        var fieldWrapper = $("<div class=\"fieldwrapper\" name=\"field" + intId + "\" id=\"field" + intId + "\"/>");
        var fName = $("<input type=\"text\" name=\"name\" class=\"fieldname\" id=\"tb"+ intId +"_1\"/>");
        var lname = $("<input type=\"text\" name=\"email\" class=\"lastname\" id=\"tb"+ intId +"_2\"/>");
        var removeButton = $("<input type=\"button\" class=\"remove\" value=\"-\" />");

        var addButton = $("<input type=\"button\" class=\"add\" id=\"add\" value=\"+\" />")
        removeButton.click(function() {
            $(this).parent().remove();
        });
        fieldWrapper.append(fName);
        fieldWrapper.append(lname);
        fieldWrapper.append(removeButton);
        fieldWrapper.append(addButton);
        $(this).remove();
        $("#buildyourform").append(fieldWrapper);

    });

});

and Html code is ...

<fieldset id="buildyourform">
    <legend>Build your own form!</legend>
    <div class="fieldwrapper" name="field1" id="field1" />
       <input type="text" name="name" class="fieldname" id="tb1_1" />
       <input type="text" name="email" class="lastname" id="tb1_2" />
       <input type="button" value="+" class="add" id="add" />
    </div>
</fieldset> 
<input type="submit" value="send" id="asdasd" name="submit" />

Check my JSFiddle also.

Whats wrong with me is when user click on "+" button first time then click function working and it adds two text-fields into my fieldset. But after that when i click on "+" button, its not triggering click function. May be id conflict. Please help.

3
  • May be id conflict. - Have you tried resolving the conflict yourself? Commented Aug 12, 2013 at 14:43
  • You're re-using the id "add" on your new buttons. Values for "id" attributes can only be used once on a page. edit oh wait, you remove the original button. Well that's the problem then :) Commented Aug 12, 2013 at 14:43
  • I had this same problem but my element was not dynamically generated, it was a plain ol' element on the page. I believe it was due to interference from Knockout.js. Commented Oct 17, 2014 at 16:50

4 Answers 4

64

You need to use the event delegation syntax of .on() here. Change:

$("#add").click(function() {

to

$("#buildyourform").on('click', '#add', function () {

jsFiddle example

Sign up to request clarification or add additional context in comments.

13 Comments

I have one more problem, when i click on "+" button, its added two text-fields. Suppose I added 4 to 5 textfields and now i am trying to remove each fields using "-" button. When I reached to my second div element and click on "-" then it removes "+" button also from my first div element. Is there any way to add event on first "-" button so that after click on "-" it should add back "+" button into my first div element??
Wouldn't it be simpler to just move the + button so that it stayed in the same place and you weren't constantly moving it?
@j08691 i don't want this
Well then if I understand you correctly, you'd need to check when the last row was deleted, and then just add a new add button to what becomes the new last row.
|
20

You need to use a delegated event handler as the #add elements dynamically appended won't have the click event bound to them. Try this:

$("#buildyourform").on('click', "#add", function() {
    // your code...
});

Also, you can make your HTML strings easier to read by mixing line quotes:

var fieldWrapper = $('<div class="fieldwrapper" name="field' + intId + '" id="field' + intId + '"/>');

Or using string interpolation (ES6 feature, so this won't work in IE):

var fieldWrapper = $(`<div class="fieldwrapper" name="field${intId}" id="field${intId}"/>`);

Or even supplying the attributes as an object:

var fieldWrapper = $('<div></div>', { 
  class: 'fieldwrapper',
  name: 'field' + intId,
  id: 'field' + intId
});

Comments

3

After making the id unique across the document ,You have to use event delegation

$("#container").on("click", "buttonid", function () {
  alert("Hi");
});

Comments

1

The click event is not bound to your new element, use a jQuery.on to handle the click.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.