-1

I have this code from @Snowmonkey

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function() {
  $("#submitBtn").on("click", submitted);
  // Created an 'add new row' button, which non-destructively adds a row to the container.
  $(".add-row-btn").on("click", function(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      $(".container").append(createNewRow());
    })
    
    // When the user chooses a different number, completely reset all the rows?
  $('#amount').on('change', function() {
    // Save a reference to the row container.
    var containerEl = $(".container");
    // wipe out completely the contents of the container.
    containerEl.empty();
    // get the number of rows to be created.
    var startingNumberOfLines = parseInt($("#amount").val());
    // loop the number of times requested, and append a new row each time.
    //   createNewRow() is defined below.
    for (var i = 0; i < startingNumberOfLines; i++) {
      $(".container").append(createNewRow());
    }
  });
  // Start with an initial value.
  $(".add-row-btn").trigger("click");
})


/*****
 * createNewRow() -- function to create a new row, composed of a text input,
 *    and two labels containing number inputs.
 *****/
var createNewRow = function() {
  /****
   * first, we'll define all the elements that will be placed
   *  in this row -- the text input, the labels and the inputs.
   ****/
  var lineTitleEl = $("<input>").attr("placeholder", "enter text here")
    .addClass("line-title");
  var labelEl = $("<label>");
  var inputEl = $("<input>").attr("step", "0.05").attr("type", "number")
    .addClass("line-number");

  // The firstNumberEl is a label containing an input. I can simply
  //   clone my label el, and input el, and use them. Don't need to,
  //   but i CAN.
  var firstNumberEl = labelEl.clone();
  firstNumberEl.text("number1: ").attr("class", "first-number-el").append(inputEl.clone());

  var secondNumberEl = labelEl.clone();
  secondNumberEl.text("number2: ").attr("class", "second-number-el").append(inputEl.clone());

  // Now create the row, which is a div containing those elements.
  var newRowEl = $("<div>").append(lineTitleEl, firstNumberEl, secondNumberEl);

  // Simply return that row -- the user can send it to the console or
  //  can append it wherever they like.
  return newRowEl;
}

/******
 * submitted() -- function to handle the submit button. We want to 
 *   iterate over all the rows, and given that they now have a consistent
 *   format, parse out the required data and display it.
 ******/
function submitted() {
  console.log("submitted");
  $(".container").children("div").each(function() {
    var title = $(this).find(".line-title").val();
    var firstNum = $(this).find(".first-number-el input").val();
    var secondNum = $(this).find(".second-number-el input").val();
    console.log(title + ", " + firstNum + ", " + secondNum);
  })

}
</script>
<style>
.line-title {
  width: 259px;
  margin: 0px;
  height: 15px;
  clear: left;
}

.line-number {
  width: 45px;
}

.container {
  margin: 10px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <fieldset style=" margin: 0 0 5px 0;">
    <!--<div>enter amount of text + number boxes:
      <input id="amount" step="1" style=" width: 45px;" type="number" value="1">
    </div>-->
    <div class="container">

    </div>
    <button class="add-row-btn">
      Add row
    </button>
    <button class="remove-row-btn">
      Remove row
    </button>
    <input class="button" id="submitBtn" style="margin-left: 85%;" type="button" value="Submit">
  </fieldset>
</form>

At the moment the code add new rows when the add row button is clicked. I want to add a similar function to the button 'remove row'. If it were clicked I want the last row to be removed, without affecting the content in the other textboxes. I have tried this, but it did not work:

  $(".remove-row-btn").on("click", function(evt) {
    evt.preventDefault();
    evt.stopPropagation();
    $(".container").remove(createNewRow());
  })

How can I do this? Thanks.

qtt qtt
  • 187
  • 3
  • 5
  • 19
  • @charlietfl how is this a duplicate? – qtt qtt Nov 21 '17 at 21:05
  • hint -- What does your createNewRow function does? – tiborK Nov 21 '17 at 21:08
  • What do you mean it didn't work? Where was that code located in your existing code? `$(".container").remove(createNewRow());` doesn't make sense. – Kevin B Nov 21 '17 at 21:10
  • 1
    This one was inadvertently answered in a previous post, where I fleshed it out with a much more complete answer, including removal and creation of a concurrent array. See that answer here: https://stackoverflow.com/questions/47398891/creating-html-content-based-on-value-in-textbox/47399984?noredirect=1#comment81834458_47399984 – Snowmonkey Nov 22 '17 at 19:03

1 Answers1

1

You could index the last element and remove it.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function() {
  $("#submitBtn").on("click", submitted);
  // Created an 'add new row' button, which non-destructively adds a row to the container.
   $(".add-row-btn").on("click", function(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      $(".container").append(createNewRow());
    })
    
    $(".remove-row-btn").on("click", function(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      $(".container div").eq($(".container div").length - 1).remove();
    })
    
    // When the user chooses a different number, completely reset all the rows?
  $('#amount').on('change', function() {
    // Save a reference to the row container.
    var containerEl = $(".container");
    // wipe out completely the contents of the container.
    containerEl.empty();
    // get the number of rows to be created.
    var startingNumberOfLines = parseInt($("#amount").val());
    // loop the number of times requested, and append a new row each time.
    //   createNewRow() is defined below.
    for (var i = 0; i < startingNumberOfLines; i++) {
      $(".container").append(createNewRow());
    }
  });
  // Start with an initial value.
  $(".add-row-btn").trigger("click");
})


/*****
 * createNewRow() -- function to create a new row, composed of a text input,
 *    and two labels containing number inputs.
 *****/
var createNewRow = function() {
  /****
   * first, we'll define all the elements that will be placed
   *  in this row -- the text input, the labels and the inputs.
   ****/
  var lineTitleEl = $("<input>").attr("placeholder", "enter text here")
    .addClass("line-title");
  var labelEl = $("<label>");
  var inputEl = $("<input>").attr("step", "0.05").attr("type", "number")
    .addClass("line-number");

  // The firstNumberEl is a label containing an input. I can simply
  //   clone my label el, and input el, and use them. Don't need to,
  //   but i CAN.
  var firstNumberEl = labelEl.clone();
  firstNumberEl.text("number1: ").attr("class", "first-number-el").append(inputEl.clone());

  var secondNumberEl = labelEl.clone();
  secondNumberEl.text("number2: ").attr("class", "second-number-el").append(inputEl.clone());

  // Now create the row, which is a div containing those elements.
  var newRowEl = $("<div>").append(lineTitleEl, firstNumberEl, secondNumberEl);

  // Simply return that row -- the user can send it to the console or
  //  can append it wherever they like.
  return newRowEl;
}

/******
 * submitted() -- function to handle the submit button. We want to 
 *   iterate over all the rows, and given that they now have a consistent
 *   format, parse out the required data and display it.
 ******/
function submitted() {
  console.log("submitted");
  $(".container").children("div").each(function() {
    var title = $(this).find(".line-title").val();
    var firstNum = $(this).find(".first-number-el input").val();
    var secondNum = $(this).find(".second-number-el input").val();
    console.log(title + ", " + firstNum + ", " + secondNum);
  })

}
</script>
<style>
.line-title {
  width: 259px;
  margin: 0px;
  height: 15px;
  clear: left;
}

.line-number {
  width: 45px;
}

.container {
  margin: 10px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <fieldset style=" margin: 0 0 5px 0;">
    <!--<div>enter amount of text + number boxes:
      <input id="amount" step="1" style=" width: 45px;" type="number" value="1">
    </div>-->
    <div class="container">

    </div>
    <button class="add-row-btn">
      Add row
    </button>
    <button class="remove-row-btn">
      Remove row
    </button>
    <input class="button" id="submitBtn" style="margin-left: 85%;" type="button" value="Submit">
  </fieldset>
</form>
Kushtrim
  • 1,899
  • 6
  • 14