1

This is must be some strange js thing I'm not aware of, but why will this code only log if the last input field changes? (Id 3) Since I am adding the eventListeners to all input fields, I'd expect outputs from all of them...

function constructInputs(ctx, id) {
    console.log(id);

    ctx.innerHTML += `<input type="text" id="${id}_textInput"></br>`;
    let textInput = document.getElementById(`${id}_textInput`);
    textInput.addEventListener("input", function (e) { 
        console.log(id);
    });
}

const ctx = document.getElementById("centerdiv");

constructInputs(ctx, '1');
constructInputs(ctx, '2');
constructInputs(ctx, '3');
<body>
    <div style="text-align: center;" id="centerdiv">
    </div>
    <script src="./main.js"></script>
</body>

1 Answers1

1

Overwriting the innerHTML will effectively destroy all event listeners and recreate the elements. Use document.createElement and appendChild or append instead.

function constructInputs(ctx, id) {
  console.log(id);
  const input = document.createElement('input');
  input.id = `${id}_textInput`;
  ctx.append(input, document.createElement('br'));
  input.addEventListener("input", function(e) {
    console.log(id);
  });
}

const ctx = document.getElementById("centerdiv");

constructInputs(ctx, '1');
constructInputs(ctx, '2');
constructInputs(ctx, '3');
<div style="text-align: center;" id="centerdiv">
</div>
Unmitigated
  • 76,500
  • 11
  • 62
  • 80