【发布时间】:2021-04-09 09:15:13
【问题描述】:
我很抱歉一直问这个问题,但我真的很挣扎,我无法弄清楚出了什么问题,我已经阅读了无数的 SO 页面和一般的互联网搜索,但没有运气。一些人在这里帮助了我,但值更新不正确,所以我认为最好在我最近的试验中提出一个新问题。
挑战是基于localStorage 创建一个客户端(仅限)模拟遛狗应用程序,到目前为止,我能够在浏览器中添加、删除和查看约会。我还设置了一个编辑功能,但是当我点击提交(#edit)时,无论我尝试编辑哪个索引,[x](结束索引)位置的值都会更新。这是我在 localStorage 中的“预订”键下存储数组的示例:
[0]{fname: "John", lname: "Smith"}
[1]{fname: "Jane", lname: "Doe"}
[2]{fname: "David", lname: "Miller"}
例如,当我在 John Smith 上点击编辑时,它将替换 David Miller 的值,而不是 Johns 的详细信息。我想尝试找到每个人的索引,类似于我在确定要在HTML(bookings[i].lname)中显示的值时所做的操作,但是这会引发错误,指出i cannot be used before initialisation(有道理,但不确定如何解决它)。
这是我最近的 JS:
// ~~~ add bookings to localStorage
var bookings = JSON.parse(localStorage.getItem("bookings")) || [];
window.onload = showBooking();
$("#submit").click(function() {
var newBookings = {
fname: $('#fname').val(),
lname: $('#lname').val()
}
bookings.push(newBookings);
var json = JSON.stringify(bookings);
window.localStorage.setItem("bookings", json);
showBooking();
});
// ~~~ edit bookings in localStorage
$(document).on('click','#edit',function (e) {
e.preventDefault();
var parent_form = $(this.form);
var fname = parent_form.find('.input:eq(0)').val();
var lname = parent_form.find('.input:eq(1)').val();
const i = bookings.findIndex(booking => bookings.fname == fname && bookings.lname == lname);
deleteBooking(i);
bookings.push({
fname,
lname
});
var json = JSON.stringify(bookings);
window.localStorage.setItem("bookings", json);
// showBooking();
});
// ~~~ display bookings in browser
function showBooking() {
var bookingResult = document.getElementById("result");
var ul = document.createElement("ul");
bookingResult.innerHTML = "";
for (let i = 0; i < bookings.length; i++) {
bookingResult.innerHTML += `<div class="card card-body bg-light m-4">
<h3>${bookings[i].fname + " " + bookings[i].lname}
<button onclick="deleteBooking(${i})" class="btn btn-danger text-light ">Delete</button>
<button onclick="editBooking(${i})" class="btn btn-danger text-light ">Edit</button>
</h3>
</div>`;
}
}
// ~~~ edit bookings in browser
function editBooking(i) {
// $('#regForm').hide();
$('#result').hide();
var currentItem = document.getElementById("currentItem");
var editBooking = document.getElementById("editAppt");
currentItem.innerHTML += `<div class="card card-body bg-light m-4">
<h3>${bookings[i].fname + " " + bookings[i].lname} </h3>
</div>`;
editBooking.innerHTML = `<input type="text" class="input" id="fname_${i}" placeholder="${bookings[i].fname}" name="${bookings[i].fname}" value="${bookings[i].fname}" required>
<input type="text" class="input" id="lname_${i}" placeholder="${bookings[i].lname}" name="${bookings[i].lname}" value="${bookings[i].lname}" required>
<input id="edit" type="submit" value="Edit">`;
}
// ~~~ delete bookings from localStorage
function deleteBooking(i) {
bookings.splice(i, 1);
localStorage.setItem("bookings", JSON.stringify(bookings));
showBooking();
}
我用于创建约会的表单(调用editBooking 时会发生变化):
<form id="regForm" name="regForm" action="" class="col-sm-6">
<div id="editAppt" class="row">
<input type="text" class="input" id="fname" placeholder="First Name" name="fname" required>
<input type="text" class="input" id="lname"placeholder="Last Name" name="lname" required>
<input id="submit" type="submit" value="Submit">
</div>
</form>
【问题讨论】:
-
您应该专注于为每个约会设置一个唯一标识符,而不是基于名字/姓氏及其在数组中的位置。当您编辑预订时,数组中当前元素的位置会发生变化,这可能就是您遇到问题的原因。
-
我根本不知道该怎么做。我的最后期限是几天后,我花了一周的时间才达到这一点。我害怕我会更多地破坏代码。表单也会有更多的元素,我什至不知道从哪里开始。
-
会不会像将
id: "uniqueID"添加到我的数组创建中一样简单?然后我必须找到一种方法来增加它的创建..对吗? @Shoejep -
基本上是的,从您提供的代码来看,无论如何您都无法添加新约会,因此您可以执行
{ id: 1, fname: "John", lname: "Smith"},例如然后将其传递给您的#edit 处理程序。如果您将当前拥有的代码保存在不同的文件中,那么处理它不会变得更糟。 -
您可以使用我的代码添加约会吗?我目前可以创建和删除,但不能编辑。它需要在提交预订时自动分配一个
id,以便以后可以检索它进行编辑。这些都不是硬编码的,我有一个将数据发送到 localStorage 的 HTML 表单。
标签: javascript jquery arrays json local-storage