【问题标题】:Multiple lists and buttons but text input not saving in correct list多个列表和按钮,但文本输入未保存在正确的列表中
【发布时间】:2017-06-23 09:33:37
【问题描述】:

我正在尝试使用多个“添加”按钮在同一页面上创建多个列表。

在文本字段 1 中输入文本并单击 button1 应该只会将内容添加到 list1(星期一)。但是 button1 正在将文本字段 2 中的文本添加到最后加载的 JS 中,即 list2 (星期二)。总共有 8 个列表,我只是想让前 2 个列表正常工作。

这是 JSFiddle:https://jsfiddle.net/sarwech/vrn5s2ns/4/

这看起来没有适当的关闭,我考虑过创建单独的本地函数,但我不太确定......

当我只想将项目添加到每个列表中时,以下方法有效:

document.getElementById("add1").onclick = function() {

var node = document.createElement("Li");
var text = document.getElementById("user_input1").value; 
var textnode=document.createTextNode(text);
node.appendChild(textnode);
document.getElementById("list_item1").appendChild(node);
localStorage.setItem('monday', JSON.stringify(list_item1));
show();

return false; }

document.getElementById("add2").onclick = function() {

var node = document.createElement("Li");
var text = document.getElementById("user_input2").value; 
var textnode=document.createTextNode(text);
node.appendChild(textnode);
document.getElementById("list_item2").appendChild(node); }

感谢任何帮助!

【问题讨论】:

    标签: javascript list button


    【解决方案1】:

    这是因为您有两个 add 函数定义。因为hoisting,后一个定义将抑制前一个。这就是为什么您实际上将星期二点击处理程序绑定到星期二和星期一的添加按钮。

    您应该考虑将代码重写为可重用的组件,例如

    function DayMeals(id, title) {
      var self = this;
    
      this.id = id;
    
      this.$el = document.createElement('div');
      this.$el.classList.add('row');
      this.$el.innerHTML = '<h4>' + title + '</h4><input type="text"/><button>Add</button><ol></ol>';
    
      this.$list = this.$el.querySelector('ol');
      this.$input = this.$el.querySelector('input');
      this.$addButton = this.$el.querySelector('button');
    
      this.meals = this.getFromStorage();
      this.updateView();
    
      this.$addButton.addEventListener('click', function() {
        self.add(self.$input.value);
      });
    
      this.$el.addEventListener('click', function(e) {
        if (e.target.dataset.remove) {
          self.remove(e.target.dataset.remove)
        }
      });
    }
    
    DayMeals.prototype.getFromStorage = function() {
      var storage = localStorage.getItem(this.id);
      return storage ? JSON.parse(storage) : [];
    };
    
    DayMeals.prototype.putToStorage = function() {
      localStorage.setItem(this.id, JSON.stringify(this.meals));
    };
    
    DayMeals.prototype.add = function(meal) {
      this.meals.push(meal);
      this.putToStorage();
      this.updateView();
    };
    
    DayMeals.prototype.remove = function(index) {
      this.meals.splice(index, 1);
      this.putToStorage();
      this.updateView();
    };
    
    DayMeals.prototype.updateView = function() {
      var listContent = '';
    
      this.meals.forEach(function(meal, i) {
        listContent += '<li>' + meal + '<button data-remove="' + i + '">x</button></li>';
      });
    
      this.$list.innerHTML = listContent;
    };
    

    fiddle

    【讨论】:

    • 哇,谢谢丹尼斯!我在你的小提琴中看不到任何 HTML,那有没有改变?我可以从下半部分看到它从存储中获取列表的位置、添加、删除和显示功能,但看不到引用回 HTML 的位置。谢谢!
    • DayMeals 实例具有 $el 属性 - 一个 DOM 节点。您需要做的就是将它附加到您需要的地方。检查小提琴中最底层的js代码。
    • 啊,对,我不熟悉这种方法,比我使用的方法更优雅。那么添加更多的工作日变量和相应的 $el 属性将允许每天使用这些函数而不会重复?此外,我是否可以使用 CSS 将其操作为 2 列,右侧有成分? (和原来的小提琴一样)
    • 是的。小提琴中有星期一和星期二的小部件,它们是完全独立的。只需创建更多具有所需配置的 DayMeals 实例即可。
    • 谢谢,你帮了大忙!对不起,最后一个问题,知道如何在第二列中有一个 DayMeals 实例吗?由于 appendChild 似乎使它成为同一个列表的一部分,所以像新函数 ColumnTwo() 之类的东西会使用与上述类似的代码吗?
    【解决方案2】:

    您有两个名为“add”的函数,最后一个覆盖了第一个。正确命名它们,即 mondayAddtuesdayAdd。其他具有相同名称的函数也是如此:'show'、'remove'。

    【讨论】:

    • 谢谢!我已将函数名称修改为独特的名称,但现在存储中的列表不显示并且按钮不起作用。我还缺少其他东西吗? jsfiddle.net/sarwech/vrn5s2ns/8
    • 您仍在为按钮单击事件绑定旧功能(不存在)。 document.getElementById('add1').addEventListener('click', add); 应该是 document.getElementById('add1').addEventListener('click', mondayAdd);
    • 谢谢,我现在已经更新了这些内容,周二可以正常工作,但是周一我遇到了错误。 “mondaylist.push 不是定义的函数”这很奇怪,因为 mondayAdd 的代码看起来不错? jsfiddle.net/sarwech/vrn5s2ns/9 编辑:对,所以这适用于 android chrome,但不适用于 windows Chrome!虽然有进步。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2018-05-05
    相关资源
    最近更新 更多