【问题标题】:localStorage Update Cannot Find innerHTML Value - Javascript/jQuerylocalStorage 更新找不到 innerHTML 值 - Javascript/jQuery
【发布时间】:2021-04-12 05:43:06
【问题描述】:

我一直在重构表单中的一些innerHTML 内容,使其更具可读性。之前,我有一个肿块innerHTML,它很难阅读,但是可以工作并允许更新到localStorage

我为每个 div 包装器提供了自己的唯一 ID,以便我可以更改 innerHTML 值,以使所有内容更整洁和可读,这工作正常,但是当我现在尝试编辑我的表单时,它给了我一个错误cannot set property 'fname' of undefined。当我将其恢复为块 html 时,它可以正常编辑吗?

我对 JS 的工作原理了解有限,所以谁能解释一下为什么会发生这种情况,有解决办法吗?

这是我的代码和编辑处理程序(简化),由于它使用 localStorage 很难在此显示,但希望它至少有帮助:

$(document).on('change keyup', '.required', function(e) {
  var disabled = true;

  $(".required").each(function() {
    var value = this.value;
    if (!(value) || (value.trim() === '') || ($(this).hasClass('is-invalid'))) {
      disabled = false;
      $('.toggle-disabled').prop("disabled", true);
    }
  });

  if (disabled) {
    $('.toggle-disabled').prop("disabled", false);
  }

});

var bookings = JSON.parse(localStorage.getItem("bookings")) || [];

$("#submit").click(function() {

  var newBookings = {
    id: new Date().getTime(),
    fname: $('#fname').val(),
    lname: $('#lname').val(),
  }

  bookings.push(newBookings);
  var json = JSON.stringify(bookings);
  window.localStorage.setItem("bookings", json);

  showBooking();
  document.getElementById('formSuccess').style.display = "block";

});

$(document).on('click', '#edit', function(e) {
  e.preventDefault();

  var parent_form = $('this.form');

  var fname = parent_form.find('.fname').val();
  var lname = parent_form.find('.lname').val();

  let i = bookings.findIndex(booking => booking.id == $(this).data("id"));

  bookings[i].fname = fname;
  bookings[i].lname = lname;

  var json = JSON.stringify(bookings);
  window.localStorage.setItem("bookings", json);

  alert('Form updated!');
  window.location.reload();
  showBooking();

});

function showBooking() {
  var bookingResult = document.getElementById("result");
  var ul = document.createElement("ul");
  bookingResult.innerHTML = `<h3 class="text-center">Your Bookings</h3>`;
  for (let i = 0; i < bookings.length; i++) {
    bookingResult.innerHTML += `
<div class="card card-body bg-light  m-4"> 
<div class="row">
<p>Owner name: ${bookings[i].fname + " " + bookings[i].lname}</p>
</div>
<div class="row">
<div class="d-grid gap-2 d-md-block">
<button onclick="editBooking(${i})" class="col-md-4 btn btn-outline-danger ">Edit</button>
<button onclick="deleteBooking(${i})" class="col-md-4 btn btn-danger text-light ">Delete</button>
</div>
</div>                          
</div>`;
  }
}

function editBooking(i) {
  $('#result').hide();
  var fnameEdit = document.getElementById("fnameEdit");
  var lnameEdit = document.getElementById("lnameEdit");

  var editButton = document.getElementById("editBtn");

  fnameEdit.innerHTML = `<input type="text" class="fname form-control required" data-id="${bookings[i].id}" placeholder="First Name" name="${bookings[i].fname}" value="${bookings[i].fname}" required>`;

  lnameEdit.innerHTML = `
<input type="text" class="lname form-control required" data-id="${bookings[i].id}" placeholder="Last Name" name="${bookings[i].lname}" value="${bookings[i].lname}" required>`;

  editButton.innerHTML = `<div class="d-grid gap-2 d-md-block">
<input id="edit" class="btn btn-danger toggle-disabled" type="submit" value="Edit">
<a href="index.html" type="button" class="btn btn-outline-danger ">Cancel</a>
</div>`;

}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<form id="regForm" name="regForm" action="" class="col-md-6">
  <div class="row">
    <div id="fnameEdit" class="col-md-6">
      <input type="text" class="input form-control required" id="fname" placeholder="First Name" name="fname" required>
    </div>
    <div id="lnameEdit" class="col-md-6">
      <input type="text" class="input form-control required" id="lname" placeholder="Last Name" name="lname" required>
    </div>
  </div>

  <div id="editBtn">
    <div class="col-md-6">
      <input id="submit" class="btn btn-danger toggle-disabled" type="submit" value="Submit">
    </div>
  </div>
</form>
<div class="col-md-6">
  <div id="result" class="row"></div>
  <div id="currentItem" class="row"></div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js">

【问题讨论】:

  • 嗨,这个$('this.form') 应该是$(this).closest('form') 然后再试一次。另外,我无法运行这是您的真实代码吗?
  • 是的,我只是缩短了一点,在这里或 codepen 上运行不正确,不知道为什么。
  • 仍然给我同样的错误,我会尝试让它在 codepen 上工作。等等。
  • 它是not found,我想可能是因为重新加载?

标签: javascript jquery dom innerhtml


【解决方案1】:

@Swati 在评论中描述了第一个问题(即:$(this).closest('form'))

因此,第二个问题与您在.findIndex() 中使用的匿名函数有关:

将此部分更改为:

let i = bookings.findIndex(booking => booking.id == $(this).data("id"));

到:

let i = bookings.findIndex(booking => booking.id == parent_form.find('.fname').data("id"));

$(document).on('change keyup', '.required', function(e) {
  var disabled = true;

  $(".required").each(function() {
      var value = this.value;
      if (!(value) || (value.trim() === '') || ($(this).hasClass('is-invalid'))) {
          disabled = false;
          $('.toggle-disabled').prop("disabled", true);
      }
  });

  if (disabled) {
      $('.toggle-disabled').prop("disabled", false);
  }

});

var bookings = JSON.parse(localStorage.getItem("bookings")) || [];

$("#submit").click(function() {

  var newBookings = {
      id: new Date().getTime(),
      fname: $('#fname').val(),
      lname: $('#lname').val(),
  }

  bookings.push(newBookings);
  var json = JSON.stringify(bookings);
  window.localStorage.setItem("bookings", json);

  showBooking();
  document.getElementById('formSuccess').style.display = "block";

});

$(document).on('click', '#edit', function(e) {
  e.preventDefault();

  var parent_form = $(this).closest('form');

  var fname = parent_form.find('.fname').val();
  var lname = parent_form.find('.lname').val();


  let i = bookings.findIndex(booking => booking.id == parent_form.find('.fname').data("id"));

  bookings[i].fname = fname;
  bookings[i].lname = lname;

  var json = JSON.stringify(bookings);
  window.localStorage.setItem("bookings", json);

  alert('Form updated!');
  window.location.reload();
  showBooking();

});

function showBooking() {
  var bookingResult = document.getElementById("result");
  var ul = document.createElement("ul");
  bookingResult.innerHTML = `<h3 class="text-center">Your Bookings</h3>`;
  for (let i = 0; i < bookings.length; i++) {
      bookingResult.innerHTML += `
  <div class="card card-body bg-light  m-4">
              <div class="row">
              <p>Owner name: ${bookings[i].fname + " " + bookings[i].lname}</p>
      </div>
      <div class="row">
              <div class="d-grid gap-2 d-md-block">
              <button onclick="editBooking(${i})" class="col-md-4 btn btn-outline-danger ">Edit</button>
              <button onclick="deleteBooking(${i})" class="col-md-4 btn btn-danger text-light ">Delete</button>
              </div>
              </div>
              </div>`;
  }
}

function editBooking(i) {
  $('#result').hide();
  var fnameEdit = document.getElementById("fnameEdit");
  var lnameEdit = document.getElementById("lnameEdit");

  var editButton = document.getElementById("editBtn");

  fnameEdit.innerHTML = `<input type="text" class="fname form-control required" data-id="${bookings[i].id}" placeholder="First Name" name="${bookings[i].fname}" value="${bookings[i].fname}" required>`;

  lnameEdit.innerHTML = `
<input type="text" class="lname form-control required" data-id="${bookings[i].id}" placeholder="Last Name" name="${bookings[i].lname}" value="${bookings[i].lname}" required>`;

  editButton.innerHTML = `<div class="d-grid gap-2 d-md-block">
          <input id="edit" class="btn btn-danger toggle-disabled" type="submit" value="Edit">
          <a href="index.html" type="button" class="btn btn-outline-danger ">Cancel</a>
          </div>`;

}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/js/bootstrap.bundle.min.js"></script>

<form id="regForm" name="regForm" action="" class="col-md-6">
    <div class="row">
        <div id="fnameEdit" class="col-md-6">
            <input type="text" class="input form-control required" id="fname" placeholder="First Name" name="fname" required>
        </div>
        <div id="lnameEdit" class="col-md-6">
            <input type="text" class="input form-control required" id="lname" placeholder="Last Name" name="lname" required>
        </div>
    </div>

    <div id="editBtn">
        <div class="col-md-6">
            <input id="submit" class="btn btn-danger toggle-disabled" type="submit" value="Submit">
        </div>
    </div>
</form>
<div class="col-md-6">
    <div id="result" class="row"></div>
    <div id="currentItem" class="row"></div>
</div>

【讨论】:

  • 没关系,但是我有多个输入,并且所有输入的错误都是相同的,这只是初始错误,因此所有字段的错误都是相同的。
【解决方案2】:

我最终解决了这个问题,我没有给属性一个新的 ID,不知何故,这解决了这个问题。我删除了 innerHTML 并替换为可以正常工作的 setAttribute 方法。

感谢您的帮助!

类似的东西:

    var fname = document.getElementById("fname");
    var lname = document.getElementById("lname");
    var editButton = document.getElementById("editBtn");

    fname.setAttribute('data-id', bookings[i].id);
    fname.setAttribute('value', bookings[i].fname);
    lname.setAttribute('data-id', bookings[i].id);
    lname.setAttribute('value', bookings[i].lname);

    editButton.innerHTML = `<div class="d-grid gap-2 d-md-block">
<input data-id="${bookings[i].id}" id="edit" class="btn btn-danger toggle-disabled" type="submit" value="Edit" disabled>
<a href="index.html" type="button" class="btn btn-outline-danger ">Cancel</a>
</div>`;

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多