Как динамически добавить номер с помощью Javascript к первой ячейке - PullRequest
0 голосов
/ 28 марта 2019

Я изучаю Javascript и застрял на данный момент. Когда пользователь вводит свое имя, фамилию, возраст и нажимает кнопку «добавить», в таблицу добавляются 1 новая строка и 4 новые ячейки со значением ввода пользователя.

Мой вопрос: как мне получить первую ячейку, которая будет числом? Который в этом случае должен быть номером 4. Если пользователь добавляет еще одну строку со значением, он должен стать номером 5. и т. Д.

Если бы кто-то мог указать мне направление или показать мне другой способ сделать это, это помогло бы. Спасибо! (CSS добавлен только для визуальных эффектов)

function allID(id) {
    return document.getElementById(id);
}

function allEvents() {
    allID("voegdatatoe").onclick = function () {
            voegToeGegevens();
    };
}

allEvents();

function voegToeGegevens() {
    var formulier = allID("invoerformulier");
    var nieuweGegevens = [];
    for (var i = 0; i < formulier.length; i++) {
        nieuweGegevens[i] = formulier.elements[i].value;
    }

    var uitvoertabel = allID("uitvoertabel");
    var nieuweRij = uitvoertabel.insertRow(-1);
    for (i = 0; i < 4; i++) {
        var NieuweCell = nieuweRij.insertCell(i);
        NieuweCell.innerHTML = nieuweGegevens[i];
    }
}

var row = document.getElementsByClassName("rownmr");
var i = 0;

for (i = 0; i < row.length; i++) {
    row[i].innerHTML = i + 1;
}
table,
th,
td {
	border-collapse: collapse;
	border: 1px solid black;
}

th,
td {
	padding: 5px;
}

th {
	text-align: left;
	background-color: #c95050;
	color: white;
}

.uitvoertabel {
	width: 60%;
}

.uitvoertabel tr:nth-child(even) {
	background-color: #eee;
}

.uitvoertabel tbody tr td:first-child {
	width: 30px;
}

.invoerform {
	margin-top: 50px;
	width: 30%;
}

.invoerform input,
label {
	display: block;
}

.invoerform label {
	margin-bottom: 5px;
	margin-top: 10px;
}

#voegdatatoe {
	margin-top: 30px;
}

input:focus {
	border: 1px solid #d45757;
	outline: none;
}
<table class="uitvoertabel" id="uitvoertabel">
   <thead>
      <tr>
         <th></th>
         <th>Voornaam</th>
         <th>Achternaam</th>
         <th>Leeftijd</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td class="rownmr"></td>
         <td>Johan</td>
         <td>cruijff</td>
         <td>54</td>
      </tr>
      <tr>
         <td class="rownmr"></td>
         <td>Frans</td>
         <td>Bauer</td>
         <td>47</td>
      </tr>
      <tr>
         <td class="rownmr"></td>
         <td>Willem</td>
         <td>van Oranje</td>
         <td>80</td>
      </tr>
   </tbody>
</table>
<form action="" id="invoerformulier" class="invoerform">
   <label>Voornaam:</label>
   <input type="text" name="vnaam" id="voornaam">
   <label>Achternaam:</label>
   <input type="text" name="anaam" id="achternaam">
   <label>Leeftijd:</label>
   <input type="text" name="points" id="leeftijd">
</form>
<button id="voegdatatoe">Voeg toe</button>

Ответы [ 4 ]

1 голос
/ 29 марта 2019

Поскольку я отмечаю, что ни один из сделанных ответов, кажется, не имеет одобрения Niekket (без проверки для кого-либо),
и что заданный вопрос сопровождается очень грубым примером(автор признается, что был заблокирован в своем ученичестве), используя много бесполезного кода ...

Поэтому я предлагаю это полное решение, которое, я надеюсь, будет достаточно полезным для правильного способа кодирования его проблемы (imho).

const
  TableBody_uitvoertabel = document.querySelector('#uitvoertabel > tbody'),
  form_invoerformulier   = document.querySelector('#invoerformulier'),
  in_voornaam     = document.querySelector('#voornaam'),
  in_achternaam   = document.querySelector('#achternaam'),
  in_leeftijd     = document.querySelector('#leeftijd')
  ;

var
  RowCount = 0; // global..

// place numbers in the first column
document.querySelectorAll('#uitvoertabel > tbody > tr td:first-child').forEach(
  elmTR=>{ elmTR.textContent = ++RowCount }
);

form_invoerformulier.onsubmit = function(e) {
  e.preventDefault();

  let
    column = 0,
    row    = TableBody_uitvoertabel.insertRow(-1)
    ;
  row.insertCell(column++).textContent = ++RowCount;
  row.insertCell(column++).textContent = in_voornaam.value;
  row.insertCell(column++).textContent = in_achternaam.value;
  row.insertCell(column++).textContent = in_leeftijd.value;

  this.reset();
} 
table, th, td {
	border-collapse: collapse;
	border: 1px solid black;
}

th, td { padding: 5px; }
th {
	text-align: left;
	background-color: #c95050;
	color: white;
}

table.uitvoertabel { width: 60%; }

table.uitvoertabel tr:nth-child(even) {
	background-color: #eee;
}

table.uitvoertabel tbody tr td:first-child {
	width: 30px;
}

form.invoerform {
	margin-top: 50px;
	width: 30%;
}

form.invoerform input,
form.invoerform label {
	display: block;
}

form.invoerform label {
	margin-bottom: 5px;
	margin-top: 10px;
}

form.invoerform button {
	margin-top: 30px;
}

form.invoerform  input:focus {
	border-color:  #d45757;
	outline: none;
}
<table class="uitvoertabel" id="uitvoertabel">
  <thead>
      <tr>
        <th></th><th>Voornaam</th><th>Achternaam</th><th>Leeftijd</th>
      </tr>
  </thead>
  <tbody>
      <tr>
        <td></td><td>Johan</td><td>cruijff</td><td>54</td>
      </tr>
      <tr>
        <td></td><td>Frans</td><td>Bauer</td><td>47</td>
      </tr>
      <tr>
        <td></td><td>Willem</td><td>van Oranje</td><td>80</td>
      </tr>
  </tbody>
</table>

<form id="invoerformulier" class="invoerform">
  <label>Voornaam:</label>
  <input type="text" name="vnaam" id="voornaam">
  <label>Achternaam:</label>
  <input type="text" name="anaam" id="achternaam">
  <label>Leeftijd:</label>
  <input type="text" name="points" id="leeftijd">

  <button type="submit">Voeg toe</button>
  <button type="reset">Reset</button>
</form>
1 голос
/ 28 марта 2019

Существует несколько способов хранения этой информации: от глобальной переменной (не рекомендуется) до некоторого локального закрытия или даже localStorage. Но у вас есть информация в DOM, так что ее проще всего использовать.

Один из способов сделать это - отсканировать идентификаторы, найти их максимум и добавить один к нему. Это включает в себя несколько изменений в вашем коде. Во-первых, мы добавили бы некоторый код для сканирования ваших идентификаторов на наибольшее значение:

        var rows = document.getElementsByClassName("rownmr");
        var highestId = Math.max(...([...rows].map(row => Number(row.textContent))))

Тогда мы бы запустили ваш массив контента с новым значением, которое больше этого максимума:

        var nieuweGegevens = [highestId + 1];

И ваш цикл должен принять это во внимание, добавив его в индекс

        for (var i = 0; i < formulier.length; i++) {
            nieuweGegevens[i + 1] = formulier.elements[i].value;
        }

Наконец, нам нужно добавить правильный класс в эту новую ячейку, чтобы при следующем вызове она продолжала работать:

        for (i = 0; i < 4; i++) {
            var NieuweCell = nieuweRij.insertCell(i);
            NieuweCell.innerHTML = nieuweGegevens[i];
            if (i === 0) {                         /**** new ****/
                NieuweCell.classList.add("rownmr") /**** new ****/
            }                                      /**** new ****/ 
        }

Вы можете увидеть эти изменения встроенными в этом фрагменте:

function allID(id) {
    return document.getElementById(id);
}

function allEvents() {
    allID("voegdatatoe").onclick = function () {
            voegToeGegevens();
    };
}

allEvents();

function voegToeGegevens() {
    var formulier = allID("invoerformulier");
    var rows = document.getElementsByClassName("rownmr");
    var highestId = Math.max(...([...rows].map(row => Number(row.textContent))))
    var nieuweGegevens = [highestId + 1];
    for (var i = 0; i < formulier.length; i++) {
        nieuweGegevens[i + 1] = formulier.elements[i].value;
    }

    var uitvoertabel = allID("uitvoertabel");
    var nieuweRij = uitvoertabel.insertRow(-1);
    for (i = 0; i < 4; i++) {
        var NieuweCell = nieuweRij.insertCell(i);
        NieuweCell.innerHTML = nieuweGegevens[i];
        if (i === 0) {
            NieuweCell.classList.add("rownmr")
        }
    }
}

var row = document.getElementsByClassName("rownmr");
var i = 0;

for (i = 0; i < row.length; i++) {
    row[i].innerHTML = i + 1;
}
table,
th,
td {
	border-collapse: collapse;
	border: 1px solid black;
}

th,
td {
	padding: 5px;
}

th {
	text-align: left;
	background-color: #c95050;
	color: white;
}

.uitvoertabel {
	width: 60%;
}

.uitvoertabel tr:nth-child(even) {
	background-color: #eee;
}

.uitvoertabel tbody tr td:first-child {
	width: 30px;
}

.invoerform {
	margin-top: 50px;
	width: 30%;
}

.invoerform input,
label {
	display: block;
}

.invoerform label {
	margin-bottom: 5px;
	margin-top: 10px;
}

#voegdatatoe {
	margin-top: 30px;
}

input:focus {
	border: 1px solid #d45757;
	outline: none;
}
<table class="uitvoertabel" id="uitvoertabel">
   <thead>
      <tr>
         <th></th>
         <th>Voornaam</th>
         <th>Achternaam</th>
         <th>Leeftijd</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td class="rownmr"></td>
         <td>Johan</td>
         <td>cruijff</td>
         <td>54</td>
      </tr>
      <tr>
         <td class="rownmr"></td>
         <td>Frans</td>
         <td>Bauer</td>
         <td>47</td>
      </tr>
      <tr>
         <td class="rownmr"></td>
         <td>Willem</td>
         <td>van Oranje</td>
         <td>80</td>
      </tr>
   </tbody>
</table>
<form action="" id="invoerformulier" class="invoerform">
   <label>Voornaam:</label>
   <input type="text" name="vnaam" id="voornaam">
   <label>Achternaam:</label>
   <input type="text" name="anaam" id="achternaam">
   <label>Leeftijd:</label>
   <input type="text" name="points" id="leeftijd">
</form>
<button id="voegdatatoe">Voeg toe</button>

Обратите внимание, что это продолжит работать с последующими добавлениями.

1 голос
/ 28 марта 2019

Добавьте дополнительные параметры length + 1 в массивы данных

function allID(id) {
    return document.getElementById(id);
}

function allEvents() {
    allID("voegdatatoe").onclick = function () {
            voegToeGegevens();
    };
}

allEvents();

function voegToeGegevens() {
var row = document.getElementsByTagName("tr");
    var formulier = allID("invoerformulier");
    var nieuweGegevens = [];
    nieuweGegevens.push(row.length) //length param for first column
    for (var i = 0; i < formulier.length; i++) {
        nieuweGegevens[i+1] = formulier.elements[i].value; //saving values from i=1

    }

    var uitvoertabel = allID("uitvoertabel");
    var nieuweRij = uitvoertabel.insertRow(-1);
    for (i = 0; i < 4; i++) {
        var NieuweCell = nieuweRij.insertCell(i);
        NieuweCell.innerHTML = nieuweGegevens[i];
    }
}

var row = document.getElementsByClassName("rownmr");
var i = 0;

for (i = 0; i < row.length; i++) {
    row[i].innerHTML = i + 1;
}
table,
th,
td {
	border-collapse: collapse;
	border: 1px solid black;
}

th,
td {
	padding: 5px;
}

th {
	text-align: left;
	background-color: #c95050;
	color: white;
}

.uitvoertabel {
	width: 60%;
}

.uitvoertabel tr:nth-child(even) {
	background-color: #eee;
}

.uitvoertabel tbody tr td:first-child {
	width: 30px;
}

.invoerform {
	margin-top: 50px;
	width: 30%;
}

.invoerform input,
label {
	display: block;
}

.invoerform label {
	margin-bottom: 5px;
	margin-top: 10px;
}

#voegdatatoe {
	margin-top: 30px;
}

input:focus {
	border: 1px solid #d45757;
	outline: none;
}
<table class="uitvoertabel" id="uitvoertabel">
   <thead>
      <tr>
         <th></th>
         <th>Voornaam</th>
         <th>Achternaam</th>
         <th>Leeftijd</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td class="rownmr"></td>
         <td>Johan</td>
         <td>cruijff</td>
         <td>54</td>
      </tr>
      <tr>
         <td class="rownmr"></td>
         <td>Frans</td>
         <td>Bauer</td>
         <td>47</td>
      </tr>
      <tr>
         <td class="rownmr"></td>
         <td>Willem</td>
         <td>van Oranje</td>
         <td>80</td>
      </tr>
   </tbody>
</table>
<form action="" id="invoerformulier" class="invoerform">
   <label>Voornaam:</label>
   <input type="text" name="vnaam" id="voornaam">
   <label>Achternaam:</label>
   <input type="text" name="anaam" id="achternaam">
   <label>Leeftijd:</label>
   <input type="text" name="points" id="leeftijd">
</form>
<button id="voegdatatoe">Voeg toe</button>
0 голосов
/ 28 марта 2019

Я думаю, что основная проблема заключается в том, что вы вручную устанавливаете rownmrs в первый раз из строки var row = document.getElementsByClassName("rownmr"); , а не каждый раз, когда нажимаете кнопку «Voeg toe».

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

HTML

<table class="uitvoertabel" id="uitvoertabel">
   <thead>
      <tr>
         <th></th>
         <th>Voornaam</th>
         <th>Achternaam</th>
         <th>Leeftijd</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td class="rownmr">1</td>
         <td>Johan</td>
         <td>cruijff</td>
         <td>54</td>
      </tr>
      <tr>
         <td class="rownmr">2</td>
         <td>Frans</td>
         <td>Bauer</td>
         <td>47</td>
      </tr>
      <tr>
         <td class="rownmr">3</td>
         <td>Willem</td>
         <td>van Oranje</td>
         <td>80</td>
      </tr>
   </tbody>
</table>
<form action="" id="invoerformulier" class="invoerform">
   <label>Voornaam:</label>
   <input type="text" name="vnaam" id="voornaam">
   <label>Achternaam:</label>
   <input type="text" name="anaam" id="achternaam">
   <label>Leeftijd:</label>
   <input type="text" name="points" id="leeftijd">
</form>
<button id="voegdatatoe">Voeg toe</button>

JS

function allID(id) {
    return document.getElementById(id);
}

function allEvents() {
    allID("voegdatatoe").onclick = function () {
            voegToeGegevens();
    };
}

allEvents();

function voegToeGegevens() {
    var formulier = allID("invoerformulier");
    var nieuweGegevens = [];
    for (var i = 0; i < formulier.length; i++) {
        nieuweGegevens[i] = formulier.elements[i].value;
    }

    var allRownmrs = document.getElementsByClassName('rownmr');

    var lastRownmr = allRownmrs[allRownmrs.length - 1].innerHTML;

    var nextRownmr = parseInt(lastRownmr) + 1;

    var uitvoertabel = allID("uitvoertabel");
    var nieuweRij = uitvoertabel.insertRow(-1);
    for (i = 0; i < 4; i++) {

      var NieuweCell = nieuweRij.insertCell(i)

        // you probably can refactor here
        if (i === 0) {
          NieuweCell.innerHTML = nextRownmr
        } else {
          NieuweCell.innerHTML = nieuweGegevens[i - 1];
        }        
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...