【问题标题】:Loading HTML from localStorage breaks function of a button从 localStorage 加载 HTML 会破坏按钮的功能
【发布时间】:2016-06-27 06:29:22
【问题描述】:

我将部分 HTML (div class="savage") 保存在 localStorage 中,并在页面刷新时检索它。有问题的 HTML 是一个文本框,用于输入和“添加新项目”按钮,以及一个带有“删除”按钮和复选框的项目的无序列表。在我向列表中添加一些项目并刷新页面后,列表会正确加载,但我不能再使用添加按钮了。我可以单击它,但没有任何反应,它不会将新项目附加到列表中。如果有人能告诉我我做错了什么或指出我正确的方向,将不胜感激。

HTML

<div class="savage">
   <h1>List of exercises to do today </h1>
   <h2> My workout <span id="counter"></span></h2>
       <form><input type="text" id="new-text"/></form><button id="add">Add</button>
           <ul id="mylist">
              <li> <input type="checkbox" class="done"/>figs<button    class="delete">delete</button></li>
              <li><input type="checkbox" class="done"/>pine nuts<button  class="delete">delete</button></li>
           </ul>
</div>

还有JQUERY

window.onload = function() {
    if(localStorage.getItem('peterslist')) {
    $('.savage').html(localStorage.getItem('peterslist'));
}
};

function updateStorage() {
    var peterslist = $('.savage').html();
    localStorage.setItem('peterslist', peterslist);
}

按钮事件处理程序

$(function(){

  $("#add").on('click', addListItem);
  $(document).on('click', '.delete', deleteitem);
  $(document).on('click', '.done', finishItem);

});

【问题讨论】:

  • 你能告诉我们你的按钮事件处理程序吗?
  • 添加了事件处理程序。

标签: jquery html


【解决方案1】:

#add 位于 .savage 内部,因此已更改,因此链接到 #add 的处理程序将丢失。结果如下代码

$(function(){

  $("#add").on('click', addListItem);
  $(document).on('click', '.delete', deleteitem);
  $(document).on('click', '.done', finishItem);

});

应该改成这个

$(function(){

  $(".savage").parent().on('click', "#add", addListItem);
  $(document).on('click', '.delete', deleteitem);
  $(document).on('click', '.done', finishItem);

});

【讨论】:

  • 非常感谢!更改事件处理程序解决了我的问题!后续问题:您能否详细说明在这种特殊情况下使用 parent() ?是遍历一个父级然后从那里开始搜索#add?
  • @Max,你几乎完全理解了这个想法。基本上我们正在寻找第一个包含 savage 的实体标签。这是它的父母。您正确使用了适用于符合#add 标准的当前和未来元素的 .on()。因此,当您调用 on() 时,它正在搜索 #add,但也将应用于 #add 的未来实例。如果我的回答解决了您的问题,您可以考虑点击复选标记接受它。
  • @LajosArpad 谢谢你的解释。对不起,我试图投票,但它没有让我,因为我是新来的。我接受了你的解决方案!
  • @Max,我很乐意提供帮助。
【解决方案2】:

您正在更改 div.savage 的 html 内容,并因此修改 DOM。如果您的按钮附加了事件,那么这些处理程序可能已经过时(使用旧的 DOM 节点)。每次更新 div.savage 的内容时,都应该重新添加按钮回调:

window.onload = function() {
  if(localStorage.getItem('peterslist')) {
    // Changing the html will remove the old nodes, and, therefore, ignore old event handlers (click).
    $('.savage').html(localStorage.getItem('peterslist'));

    // Load again the `.click()` events here, after loading the html
    $("#add").on('click', addListItem);
    $(document).on('click', '.delete', deleteitem);
    $(document).on('click', '.done', finishItem);
  }
};

【讨论】:

  • 这是次优的。第二个和第三个 click 事件处理程序不会消失,因为它们链接到 document.on(),而第一个是问题所在。可以链接到.savage的父级,看我的回答。
猜你喜欢
  • 2023-04-07
  • 2019-06-22
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2021-12-27
  • 1970-01-01
  • 2016-11-16
相关资源
最近更新 更多