Автонумерация строк в таблице HTML

Пытаюсь создать простую автонумерацию строк для таблицы. Я создаю переменную = 1, и пытаюсь сказать компьютеру что когда я добавляю новою строчку то переменная = переменная + 1, и оно себе приписывает ее мне в первый столбик. Но у меня получается что все строчки имеют номер 1, может кто то подскажет в чем проблема? Заранее спасибо!

document.getElementById("myBtn").onclick = dodajWiersz;
    
function dodajWiersz() {
  var lp = 1;
  var wiersz = document.createElement("tr");

   var liczba = document.createElement("td");
   //var val1 = document.getElementById("liczba").value;
   //liczba.innerHTML = val1;
  liczba.innerHTML = lp;

   var imie = document.createElement("td");
   var val2 = document.getElementById("imie").value;
   imie.innerHTML = val2;

   var nazwisko = document.createElement("td");
   var val3 = document.getElementById("nazwisko").value;
   nazwisko.innerHTML = val3;

   var email = document.createElement("td");
   var val4 = document.getElementById("email").value;
   email.innerHTML = val4;

   var wiek = document.createElement("td");
   var val5 = document.getElementById("wiek").value;
   wiek.innerHTML = val5;

   var data = document.createElement("td");
   var val6 = document.getElementById("data").value;
   data.innerHTML = val6;


   var plec = document.createElement("td");
   var val7 = document.querySelector('input[name="gender"]:checked').value;
   plec.innerHTML = val7;


   var grupa = document.createElement("td");
   var val8 = document.getElementById("grupa").value;
   grupa.innerHTML = val8;

   wiersz.appendChild(liczba);
   wiersz.appendChild(imie);
   wiersz.appendChild(nazwisko);
   wiersz.appendChild(email);
   wiersz.appendChild(wiek);
   wiersz.appendChild(data);
   wiersz.appendChild(plec);
   wiersz.appendChild(grupa);
   var dodac = document.getElementById("tbd");
   if (dodac.appendChild(wiersz) == true) {
       lp = lp + 1;
   };
}
<table id="customersKontakty">
   <thead>
   <tr>
       <th>Liczba porządkowa</th>
       <th>Imię</th>
       <th>Nazwisko</th>
       <th>Email</th>
       <th>Wiek</th>
       <th>Data urodzenia</th>
       <th>Płeć</th>
       <th>Grupa</th>
   </tr>
   </thead>
   <tbody id="tbd">

   </tbody>
</table>
<element class="plabel">
  <br><br><br>
  <p class="plabell">Liczba porządkowa:<p><input type="number" id="liczba"></p></p>
  <p class="plabell">Imię:<p><input type="text" id="imie"></p></p>
  <p class="plabell">Nazwisko:<p><input type="text" id="nazwisko"></p></p>
  <p class="plabell">Email:<p><input type="email" id="email"></p></p>
  <p class="plabell">Wiek:<p><input type="number" id="wiek"></p></p>
  <p class="plabell">Data urodzenia:<p><input type="date" id="data"></p></p>
  <p class="plabell">Płeć:
    <p>
        <input type="radio" name="gender" value="Mężczyzna"> Mężczyzna
        <input type="radio" name="gender" value="Kobieta"> Kobieta
    </p>
  </p>
  <p class="plabell">Grupa:
    <p>
      <select id="grupa">
          <option value="Rodzina">Rodzina</option>
          <option value="Przyjaciele">Przyjaciele</option>
          <option value="Praca">Praca</option>
          <option value="Znajomi">Znajomi</option>
      </select>
    </p>
  </p>
</element>
<p align="center"><input type="button" value="Dodaj osobę" id="myBtn"></p>


Ответы (1 шт):

Автор решения: OPTIMUS PRIME

1: var lp = 1; объявляется новая переменная при каждом вызове функции, нужно вынести его из функции, чтобы значение хранилось между вызовами.

2: if (dodac.appendChild(wiersz) == true) lp = lp + 1; вызов dodac.appendChild(wiersz) возвращает добавленный узел, т.е. wiersz. А сравнение <HTML-node> == true всегда дает false, потому что операция пытается превратить оба операнда в число, NaN == 1false.

Доказательство:

console.log( document.body == true ); // false

document.body.valueOf = function() {
  console.log('xD');
  return 1;
};

console.log( document.body == true ); // true

3: Если пишете код, требующий ввода данных, подготовьте значения по умолчанию, чтобы во время написания кода постоянно не вводить то же самое...

document.querySelectorAll('input').forEach(e => e.value = '11');
// Временно, для удобного тестирования.

document.getElementById("myBtn").onclick = dodajWiersz;

var lp = 1;

function dodajWiersz() {
  var wiersz = document.createElement("tr");

  var liczba = document.createElement("td");
  //var val1 = document.getElementById("liczba").value;
  //liczba.innerHTML = val1;
  liczba.innerHTML = lp;

  var imie = document.createElement("td");
  var val2 = document.getElementById("imie").value;
  imie.innerHTML = val2;

  var nazwisko = document.createElement("td");
  var val3 = document.getElementById("nazwisko").value;
  nazwisko.innerHTML = val3;

  var email = document.createElement("td");
  var val4 = document.getElementById("email").value;
  email.innerHTML = val4;

  var wiek = document.createElement("td");
  var val5 = document.getElementById("wiek").value;
  wiek.innerHTML = val5;

  var data = document.createElement("td");
  var val6 = document.getElementById("data").value;
  data.innerHTML = val6;


  var plec = document.createElement("td");
  var val7 = document.querySelector('input[name="gender"]:checked').value;
  plec.innerHTML = val7;


  var grupa = document.createElement("td");
  var val8 = document.getElementById("grupa").value;
  grupa.innerHTML = val8;

  wiersz.appendChild(liczba);
  wiersz.appendChild(imie);
  wiersz.appendChild(nazwisko);
  wiersz.appendChild(email);
  wiersz.appendChild(wiek);
  wiersz.appendChild(data);
  wiersz.appendChild(plec);
  wiersz.appendChild(grupa);
  var dodac = document.getElementById("tbd");

  dodac.appendChild(wiersz);
  lp = lp + 1;
}
<table id="customersKontakty">
  <thead>
    <tr>
      <th>Liczba porządkowa</th>
      <th>Imię</th>
      <th>Nazwisko</th>
      <th>Email</th>
      <th>Wiek</th>
      <th>Data urodzenia</th>
      <th>Płeć</th>
      <th>Grupa</th>
    </tr>
  </thead>
  <tbody id="tbd">

  </tbody>
</table>
<element class="plabel">
  <br><br><br>
  <p class="plabell">Liczba porządkowa:
    <p><input type="number" id="liczba"></p>
  </p>
  <p class="plabell">Imię:
    <p><input type="text" id="imie"></p>
  </p>
  <p class="plabell">Nazwisko:
    <p><input type="text" id="nazwisko"></p>
  </p>
  <p class="plabell">Email:
    <p><input type="email" id="email"></p>
  </p>
  <p class="plabell">Wiek:
    <p><input type="number" id="wiek"></p>
  </p>
  <p class="plabell">Data urodzenia:
    <p><input type="date" id="data"></p>
  </p>
  <p class="plabell">Płeć:
    <p>
      <input checked type="radio" name="gender" value="Mężczyzna"> Mężczyzna
      <input type="radio" name="gender" value="Kobieta"> Kobieta
    </p>
  </p>
  <p class="plabell">Grupa:
    <p>
      <select id="grupa">
        <option value="Rodzina">Rodzina</option>
        <option value="Przyjaciele">Przyjaciele</option>
        <option value="Praca">Praca</option>
        <option value="Znajomi">Znajomi</option>
      </select>
    </p>
  </p>
</element>
<p align="center"><input type="button" value="Dodaj osobę" id="myBtn"></p>


4: Придется всё пересчитывать при удалении строк. Можно написать более удобную функцию на JS, но существует решение на CSS-counter(), значительно проще:

td {
  width: 100px;
  height: 20px;
  border: 1px solid #999;
}

table {
  border: 2px solid orange;
  counter-reset: bubu;
}

td:nth-child(1) {
  counter-increment: bubu;
}

td:nth-child(1)::before {
  content: counter(bubu) '.';
}
<table>
  <tr><td></td><td></td></tr>
  <tr><td></td><td></td></tr>
  <tr><td></td><td></td></tr>
</table>

<table>
  <tr><td></td><td></td></tr>
  <tr><td></td><td></td></tr>
  <tr><td></td><td></td></tr>
</table>

При изменении количества строк, автоматчески пересчитает.

→ Ссылка