如何让我的按钮更新正确的 table 行值

How Can I Make My Button To Update Correct table Row Values

我刚刚完成了 JavaScript DOM 操作,但我发现无论我要编辑哪一行,都只会更新最后一行。完整的代码托管在这里:https://github.com/Alekz19/ncdc-project

//Function that edit any row being clicked (Works well)
function edit() { 
    submit.style.display = "none";
    update.style.display = "block";
    for (let i = 0; i < rows.length; i++) {
        rows[i].onclick = function editBtn() { 
            rIndex = this.rowIndex;
            let name = this.cells[0].innerHTML,
            fullName = name.split(" "),
            fName = fullName[0],
            lName = fullName[1],
            f1 = document.getElementById('fname-2'),
            f2 = document.getElementById('lname-2'),
            f3 = document.getElementById('email-2'),
            f4 = document.getElementById('gender-2');
            f1.value = fName;
            f2.value = lName;
            f3.value = this.cells[1].innerHTML;
            f4.value = this.cells[2].innerHTML;
        };
       //function that update form data in the table 
(updating last rows only instead of the specific one)
    update.onsubmit = function updateData() {
        update.style.display = "none";
        submit.style.display = "block";
        rows[i].cells[0].innerHTML = 
document.getElementById('fname-2').value + " " + 
document.getElementById('lname-2').value;
    rows[i].cells[1].innerHTML = 
document.getElementById('email-2').value;
    rows[i].cells[2].innerHTML = 
document.getElementById('gender-2').value;
    rows[i].cells[3].innerHTML = 
document.getElementById('checkBox').value;
    rows[i].cells[4].innerHTML = "<input type='button'  
class='edit-button' value='Edit' onclick='edit(this)'>";
    rows[i].cells[5].innerHTML = "<input type='button' 
class='delete-button' value='Delete' 
onclick='delBtn(this)'>";
return false;
    };
};
}

当您调用编辑函数时,向其中传递一个事件:

function edit(event) { 

click事件会被点击的按钮,然后找parent的parent得到被点击的行按钮:

event.parentElement.parentElement.

并使用它来更新正确的行:

    update.onsubmit = function updateData() {
        update.style.display = "none";
        submit.style.display = "block";
        event.parentElement.parentElement.cells[0].innerHTML = document.getElementById('fname-2').value + " " + document.getElementById('lname-2').value;
        event.parentElement.parentElement.cells[1].innerHTML = document.getElementById('email-2').value;
        event.parentElement.parentElement.cells[2].innerHTML = document.getElementById('gender-2').value;
        event.parentElement.parentElement.cells[3].innerHTML = document.getElementById('checkBox').value;
return false;
    };

请注意,更新时不需要此处的按钮。

编辑: 我不应该修复你的整个代码,我向你展示了如何获得正确的行,这是问题所在,而不是这个...

不要使用这个:

let status = document.getElementById("checkBox");
status.onchange = function checkBoxStatus() {
  if (status.checked) {
    document.getElementById("checkBox").value = "Yes";
  } else {
    document.getElementById("checkBox").value = "No";
  }

使用这个:

function checkBoxStatus(event) {
  if (event.checked) {
    event.value = "Yes";
  } else {
    event.value = "No";
  }

您正在使用内联 HTML on-change,不需要另一个。

在 HTML 中的两个复选框输入上,您有两个,checkboxcheckBox2 onchange="checkBoxStatus(this)" 并且仅针对事件设置单击事件的值。

而且 checkBoxStatuscheckboxStatus 不一样,请检查您的拼写错误!

您还必须根据来自 table 的值编辑设置您的 (OTHER) 复选框 checkBox2:

  if (event.parentElement.parentElement.cells[3].innerHTML === "No") {
    document.getElementById('checkBox2').checked = false;
  } else {
    document.getElementById('checkBox2').checked = true;
  }

并在其编辑后(它将调用 function checkBoxStatus(event))设置要提交的正确的:

event.parentElement.parentElement.cells[3].innerHTML = document.getElementById('checkBox2').value;

片段已更新,所有内容均已修复...

工作示例:

let rIndex;
const dataTable = document.getElementById('database'),
  submit = document.getElementById("data"),
  update = document.getElementById("data-2");
let rows = dataTable.children[1].getElementsByTagName('tr');
//function that activate the checkbox status
function checkBoxStatus(event) {
  if (event.checked) {
    event.value = "Yes";
  } else {
    event.value = "No";
  }
}
//Page Date and Time Function
function currentDate() {
  let showDate = document.getElementById('showDate'),
    d = new Date(),
    days = ["Sun,", "Mon,", "Tue,", "Wed,", "Thu,", "Fri,", "Sat,"],
    today = days[d.getDay()],
    months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
    thisMonth = months[d.getMonth()],
    date = d.getDate(),
    year = d.getFullYear(),
    hour = d.getHours(),
    minute = d.getMinutes(),
    second = d.getSeconds(),
    meridian;
  if (hour >= 12) {
    meridian = "PM";
  } else {
    meridian = "AM";
  }
  if (hour === 0) {
    hour = 12;
  }
  if (hour >= 13 && hour <= 21 || hour > 21) {
    hour = (hour - 12);
  }
  if (hour < 10) {
    hour = "0" + hour;
  }
  if (second < 10) {
    second = "0" + second;
  }
  if (minute < 10) {
    minute = "0" + minute;
  }
  showDate.textContent = today + " " + thisMonth + " " + date + " " + year + ". " + hour + ":" + minute + ":" + second + " " + meridian;
  const t = setTimeout(function() {
    currentDate();
  }, 1000);
}
currentDate();
//function that shows the submit form data in the table
function showData() {
  let tableRows = document.createElement('tr'),
    td1 = document.createElement('td'),
    td2 = document.createElement('td'),
    td3 = document.createElement('td'),
    td4 = document.createElement('td'),
    td5 = document.createElement('td'),
    td6 = document.createElement('td');
  td1.innerHTML = document.getElementById('fname').value + " " + document.getElementById('lname').value;
  td2.innerHTML = document.getElementById('email').value;
  td3.innerHTML = document.getElementById('gender').value;
  td4.innerHTML = document.getElementById("checkBox").value;
  td5.innerHTML = "<input type='button' class='edit-button' value='Edit' onclick='edit(this)'>";
  td6.innerHTML = "<input type='button' class='delete-button' value='Delete' onclick='delBtn(this)'>";
  tableRows.appendChild(td1);
  tableRows.appendChild(td2);
  tableRows.appendChild(td3);
  tableRows.appendChild(td4);
  tableRows.appendChild(td5);
  tableRows.appendChild(td6);
  submit.reset();
  dataTable.children[1].insertBefore(tableRows, dataTable.children[0].childNodes[tableRows.length]);
  return false;
};
//Function that edit any row being clicked
function edit(event) {

  if (event.parentElement.parentElement.cells[3].innerHTML === "No") {
    document.getElementById('checkBox2').checked = false;
  } else {
    document.getElementById('checkBox2').checked = true;
  }



  submit.style.display = "none";
  update.style.display = "block";
  for (let i = 0; i < rows.length; i++) {
    rows[i].onclick = function editBtn() {
      rIndex = this.rowIndex;
      let name = this.cells[0].innerHTML,
        fullName = name.split(" "),
        fName = fullName[0],
        lName = fullName[1],
        f1 = document.getElementById('fname-2'),
        f2 = document.getElementById('lname-2'),
        f3 = document.getElementById('email-2'),
        f4 = document.getElementById('gender-2');
      f1.value = fName;
      f2.value = lName;
      f3.value = this.cells[1].innerHTML;
      f4.value = this.cells[2].innerHTML;
    };
    //function that update form data in the table
    update.onsubmit = function updateData() {
      update.style.display = "none";
      submit.style.display = "block";
      event.parentElement.parentElement.cells[0].innerHTML = document.getElementById('fname-2').value + " " + document.getElementById('lname-2').value;
      event.parentElement.parentElement.cells[1].innerHTML = document.getElementById('email-2').value;
      event.parentElement.parentElement.cells[2].innerHTML = document.getElementById('gender-2').value;
      event.parentElement.parentElement.cells[3].innerHTML = document.getElementById('checkBox2').value;
      return false;
    };
  };
}
//Function that delete any row being clicked
function delBtn(r) {
  var del = r.parentNode.parentNode.rowIndex;
  dataTable.deleteRow(del);
};
body {
  min-height: 800px
}
<html>

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>NCDC Database</title>
  <style>
    body {
      margin: 0;
    }
    
    fieldset {
      background-image: url('corona.jpg');
      width: 95%;
      margin: 10px auto;
    }
    
    legend {
      text-align: center;
      border: 1px solid black;
    }
    
    #data {
      margin: 10px 20px;
      width: 95%;
      padding: 15px;
      border: 1px solid #ccc;
      border-radius: 0.5em;
      display: block;
    }
    
    #data-2 {
      margin: 10px 20px;
      width: 95%;
      padding: 15px;
      border: 1px solid #CCC;
      border-radius: 0.5em;
      display: none;
    }
    
    form div {
      margin-top: 15px;
    }
    
    label {
      display: inline-block;
      margin-left: 20px;
      width: 100px;
    }
    
    label.gender {
      width: 80px;
      margin-left: 20px;
    }
    
    input[type=text],
    input[type=email] {
      font: 16px sans-serif;
      width: 250px;
      padding-left: 10px;
      margin-left: 20px;
      height: 35px;
      -moz-box-sizing: border-box;
      box-sizing: border-box;
      border: 1px solid #999;
    }
    
    input[type=checkbox] {
      height: 14px;
      margin-left: 55px;
    }
    
    .checklabel {
      font: 14px sans-serif;
      display: inline;
      margin-left: 5px;
    }
    
    input[type=button] {
      width: 70px;
      padding: 0 5px;
    }
    
    .submitbutton {
      background-color: black;
      border-radius: 10%;
      color: white;
      width: 100px;
      margin: 10px 0 5px 100px;
    }
    
    input:focus {
      border-color: #999;
    }
    
    #table-container {
      width: 100%;
      margin-left: 20px;
    }
    
    #edit-container {
      display: block;
    }
    
    table {
      border-spacing: 10px;
      margin-top: 50px;
      width: 98%;
      border-collapse: collapse;
    }
    
    th {
      background-color: #ccc;
      margin: 0 -20px;
      text-align: center;
      padding: 10px;
    }
    
    tr:nth-child(even) {
      background-color: #fdedec;
    }
    
    td {
      padding: 8px;
      text-align: center;
    }
    
    #showDate {
      background-color: black;
      margin-left: 50px;
      word-spacing: 2px;
      color: white;
      padding: 0 5px;
      font-style: italic;
      font-weight: bolder;
    }
  </style>
</head>

<body>
  <div id="form-container">
    <form id="data" onsubmit="return showData()">
      <fieldset>
        <legend>Covid-19 Database<span id="showDate"></span>
        </legend>
        <div>
          <label for "First Name">First Name: </label> <input id="fname" class="first_name" name="firstName" type="text" placeholder="Enter your first name here" required>
        </div>
        <div>
          <label for "Last Name">Last Name: </label> <input id="lname" class="last_name" name="lastName" type="text" placeholder="Enter your last name here" required>
        </div>
        <div>
          <label for "Email">Email: </label> <input id="email" class="mail" name="email" type="email" placeholder=" Enter your email address here" required>
        </div>
        <div>
          <label for "Gender" class="gender">Gender: </label>
          <select id="gender" required>
            <option value="" disabled selected>Select your Gender</option>
            <option value="Male">Male</option>
            <option value="Female">Female</option>
          </select>
        </div>
        <div>
          <input type="checkbox" name="check" id="checkBox" class="check_box" checked value="Yes" onchange="checkBoxStatus(this)">
          <label for="checkBox" class="checklabel"> Recently came into Nigeria within the last 14 days?</label>
        </div>
        <div>
          <input type="submit" class="submitbutton" value="Submit">
        </div>
      </fieldset>
    </form>
    <form id="data-2" onsubmit="return updateData()">
      <fieldset>
        <legend>Covid-19 Database</legend>
        <div>
          <label for "First Name">First Name: </label> <input id="fname-2" class="first_name" name="firstName" type="text" placeholder="Enter your first name here" required>
        </div>
        <div>
          <label for "Last Name">Last Name: </label> <input id="lname-2" class="last_name" name="lastName" type="text" placeholder="Enter your last name here" required>
        </div>
        <div>
          <label for "Email">Email: </label> <input id="email-2" class="mail" name="email" type="email" placeholder=" Enter your email address here" required>
        </div>
        <div>
          <label for "Gender" class="gender">Gender: </label>
          <select id="gender-2" required>
            <option value="" disabled selected>Select your Gender</option>
            <option value="Male">Male</option>
            <option value="Female">Female</option>
          </select>
        </div>
        <div>
          <input type="checkbox" name="check" id="checkBox2" class="check_box" checked value="Yes" onchange="checkBoxStatus(this)">
          <label for="checkBox-2" class="checklabel"> Recently came into Nigeria within the last 14 days?</label>
        </div>
        <div>
          <input type="submit" class="submitbutton" value="Update">
        </div>
      </fieldset>
    </form>
  </div>
  <div id="table-container">
    <table id="database" border="1">
      <thead>
        <tr>
          <th width="20%">Name</th>
          <th>Email Address</th>
          <th>Gender</th>
          <th>Came to Nigeria within the last 14 days?</th>
          <th colspan='2'>Action</th>
        </tr>
      </thead>
      <tbody>
      </tbody>
    </table>
  </div>
</body>

</html>