0

I try to do a dynamic for ans I am very new with JS. With what I do, new added field keeps on deleting the previous:

function add_input() {
  var s = document.getElementById('ref').value;
  var i = 0;
    while ( i < s) {
      document.getElementById('the_list').innerHTML =
        '<p><input type="text" name="holder_'+ i +'" /></p>';
        
        i++;
    }
}
<input type="number" name="ref" id="ref" onchange="add_input();">
<div id="the_list"></div>
Kunj
  • 1,980
  • 2
  • 22
  • 34

6 Answers6

0

use += to add the new element with previous elements.

function add_input() {
        var s = document.getElementById('ref').value;
        var i = 0;
            while ( i < s) {
            console.log(s);
            document.getElementById('the_list').innerHTML +='<p><input type="text" name="holder_'+ i +'" ></p>';
                        i++;
            }
    }
<input type="number" name="ref" id="ref" onchange="add_input();">
<div id="the_list"></div>
Ismail Rubad
  • 1,458
  • 2
  • 13
  • 27
0

Try this

 function add_input() {
        
        $( "#the_list" ).empty();//if you want to delete previous elements otherwise remove this
        var s = document.getElementById('ref').value;
        var i = 0;
            while ( i < s) {
$('#the_list').append('<p><input type="text" name="holder_'+ i +'" /></p>');  
                        i++;
            }
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" name="ref" id="ref" onchange="add_input();">
<div id="the_list"></div>
p u
  • 1,395
  • 1
  • 17
  • 30
0

To directly answer your problem, you should use += instead of = when you add new HTML into it because by using =, you are overriding existing child elements inside it (deleting them).

So by using +=, you are just appending after existing child elements instead of overriding them.

function add_input() {
  var s = document.getElementById('ref').value;
  var i = 0;
    while (i < s) {
      document.getElementById('the_list').innerHTML += '<p><input type="text" name="holder_'+ i +'" /></p>';
      i++;
    }
}
<input type="number" name="ref" id="ref" onchange="add_input();">
<div id="the_list"></div>

Better yet, you should use DOM method appendChild directly instead of adding raw HTML:

function add_input() {
  var theList = document.getElementById('the_list');
  var s = document.getElementById('ref').value;
  var i = 0;
  var p;
  var input;
  while ( i < s) {
    p = document.createElement('p');
    input = document.createElement('input');
    input.setAttribute('type', 'text');
    input.setAttribute('name', 'holder_' + i);
    p.appendChild(input);
    theList.appendChild(p);
    i++;
  }
}
<input type="number" name="ref" id="ref" onchange="add_input();">
<div id="the_list"></div>
yqlim
  • 6,898
  • 3
  • 19
  • 43
0

Actually, in your while code, you are missing + sign due to which each time the loop is adding only one element removing previously added input fields.

Just update your function like

 function add_input() {
        var s = document.getElementById('ref').value;
        document.getElementById('the_list').innerHTML = ""; // setting innerHTML of div to empty
        var i = 0;
            while ( i < s) {
            document.getElementById('the_list').innerHTML +='<p><input type="text" name="holder_'+ i +'" /></p>';
            //You are missing that + sign
                        i++;
            }
    }
Sajjad Ali
  • 304
  • 3
  • 12
0

This should work..

<script type="text/javascript">
    function add_input(){
        var s = document.getElementById('ref').value;
        var i = 0;
            while ( i < s) {
              var ele = document.createElement("INPUT");
              ele.setAttribute("type", "text");
              ele.setAttribute("value", "Hello World!"); 
              ele.setAttribute("name", "holder_"+i); 
              document.getElementById('the_list').appendChild(ele);
              i++;
            }
    }
 </script>
Shashidhara
  • 665
  • 6
  • 22
0

You should just add + to your code like this:

innerHtml +=; 

That is all. It means adding element to the previous.

Rich
  • 6,470
  • 15
  • 32
  • 53