【问题标题】:Adding rows to a table, looping an array, doing crazy things, readding first row each time向表中添加行,循环数组,做疯狂的事情,每次读取第一行
【发布时间】:2017-07-06 16:20:24
【问题描述】:

我觉得这可能是某个地方的循环问题,但我对编码有点新,我无法弄清楚问题到底出在哪里。 每次我向列表中添加新任务时,它都会再次打印第一个任务。因此,如果我添加第二个任务,它将第一个任务和第二个任务插入到表中,如果我添加第三个任务,它将第一个任务和第三个任务插入到表中.. 很奇怪。

我查看了我的本地存储文件,并且它被正确存储。如,(任务一,任务二,任务三)那里没有重复,它会按照我想要的方式存储。

问题是我正在尝试这样做:

我想遍历数组,并将本地存储中存储的所有内容都发布到表上。 (目前,当我刷新时它会完全重置。它的作用类似于会话存储而不是本地存储。刷新后它会显示在本地存储中,但是一旦我单击以在刷新后添加更多内容,它就会消失) 它是一个待办事项列表,所以我希望它基本上通过遍历数组来显示所有项目,当我添加一个新项目时,让它存储它并再次循环遍历数组并将其发布在桌子上。

var table = document.getElementById("tableBody");

toDoArray = [];


function buildTable(){
addToStorage();
var retrievedTaskObject = localStorage.getItem("task");
var parsedObject = JSON.parse(retrievedTaskObject);
var addTheTaskName = parsedObject.taskName;
var addTheTaskDate = parsedObject.taskDate;


  for(i=0; i < toDoArray.length; i++){
    var row = table.insertRow(0);
    var cellName = row.insertCell(0);
    var cellDate = row.insertCell(1);
    var cellId = row.insertCell(2);
    var cellCheck = row.insertCell(3);
    cellName.innerHTML= parsedObject[i].name;
    cellDate.innerHTML= parsedObject[i].date;
    var checkStuff = "<input type='checkbox'>";
    cellCheck.innerHTML = checkStuff;
  }


}

function submitForm(name,date) {
    var addTaskName = document.getElementById("taskName").value;
    var addTaskDate = document.getElementById("dateTask").value;
    var taskSomething = getTaskObj(addTaskName,addTaskDate);
      toDoArray.push(taskSomething);
      buildTable();
};

function getTaskObj(taskName,taskData){
var taskObject = {
        name: taskName,
        date: taskData,
      };
 return taskObject;
}

function addToStorage(){
  var storedArray = JSON.stringify(toDoArray);
  localStorage.setItem("task",storedArray);}

【问题讨论】:

  • 你也可以添加你的html
  • buildTable 函数中声明i 可能有帮助吗?

标签: javascript arrays loops html-table local-storage


【解决方案1】:

这是我的 cmets 的 sn-p。

var tasksStorageName = 'myTasks';
var tasksTable = document.getElementById("tasks_table");
var saveBtn = document.getElementById("save_task_btn");
var tasksList;
var storage = getStorage();

// this is dirty workaround, because localStorage disabled
// due to security reasons. feel free to remove this function
// and use localStorage directly
function getStorage() {
  try {
    return window.localStorage;
  }
  catch(e) {
    return {
      get: function(key) {
        return JSON.stringify([
          {
            id: Date.now(),
            name: 'first task',
            date: '10/10/2016',
            done: false
          }
        ]);
      },
      set: function(key, object) {

      }
    };
  }
}

function getTasksList() {
  var dumpedTasks = storage.get(tasksStorageName);
  
  // in case there are no tasks saved we return empty list
  // otherwise parse our tasks.
  return dumpedTasks == null ? [] : JSON.parse(dumpedTasks);
}

function dumpTaskList(tasksList) {
  var dumpedTasks = JSON.stringify(tasksList);
  
  storage.set(tasksStorageName, dumpedTasks);
}

// try to reuse things, so we have `renderTasks` function
// to render all our tasks to table which uses `renderTask`
// for each task. later we'll use it to add our newly created
// tasks.
function renderTasks(tasks) {
  for (var index = 0; index < tasks.length; index++) {
    var task = tasks[index];
    
    renderTask(task);
  }
}

// helper function to create checkbox
function createCheckboxForTask(task){
    var checkbox = document.createElement('input'); 
    checkbox.type = 'checkbox';
    checkbox.checked = task.done;
    
    return checkbox;
}

function renderTask(task) {
  var taskRow = tasksTable.insertRow();
  var doneCell = taskRow.insertCell();
  var nameCell = taskRow.insertCell();
  var dateCell = taskRow.insertCell();
  
  taskRow.id = task.id;
  doneCell.appendChild(createCheckboxForTask(task));
  nameCell.innerText = task.name;
  dateCell.innerText = task.date;
}

function createTask(name, date) {
  return {
    // quite naive id generation, don't use it in production
    id: Date.now(),
    name: name,
    date: date,
    done: false
  }
}

// to restore your previously added tasks
// you need to get them from localStorage
// on load event and render them.
window.addEventListener('load', function(e) {
  tasksList = getTasksList();
  
  if (tasksList.length > 0) {
    renderTasks(tasksList);
  }
});

saveBtn.addEventListener('click', function() {
  var name = document.getElementById("task_name").value;
  var date = document.getElementById("task_date").value;
  var newTask = createTask(name, date);
  
  tasksList.push(newTask);
  renderTask(newTask);
  dumpTaskList(tasksList);
});
/*
// function does too many things
function buildTable(){
// if you try to call `buildTable` at page load then
// `addToStorage` function will set localStorage task item
// to empty array. thats why you lost your state every time
// you reload page
addToStorage();
var retrievedTaskObject = localStorage.getItem("task");
var parsedObject = JSON.parse(retrievedTaskObject);
// why this two unnecessary variables?
var addTheTaskName = parsedObject.taskName;
var addTheTaskDate = parsedObject.taskDate;

for(i=0; i < toDoArray.length; i++){
  addTaskToTable(parsedObject[i]);
}



}

// try to give parametes as well as variables meaningful names
// like `task` this time, not `obj`
function addTaskToTable(obj){
  var row = table.insertRow(0);
  var cellName = row.insertCell(0);
  var cellDate = row.insertCell(1);
  var cellId = row.insertCell(2);
  var cellCheck = row.insertCell(3);
  cellName.innerHTML= obj.name;
  cellDate.innerHTML= obj.date;
  var checkStuff = "<input type='checkbox'>";
  cellCheck.innerHTML = checkStuff;

}

function submitForm(name,date) {
    var addTaskName = document.getElementById("taskName").value;
    var addTaskDate = document.getElementById("dateTask").value;
    var taskSomething = getTaskObj(addTaskName,addTaskDate);
      toDoArray.push(taskSomething);
      addTaskToTable(taskSomething);
};

// actually you are creating new task object, not getting it
// from somewhere, so it's better to name it like createTask
// or newTask
function getTaskObj(taskName,taskData){
var taskObject = {
        name: taskName,
        date: taskData,
      };
 return taskObject;
}

function addToStorage(){
  var storedArray = JSON.stringify(toDoArray);
  localStorage.setItem("task",storedArray);
  }
  */
<div>
  <label>Name: </label>
  <input id="task_name" type="text"/>
</div>
<div>
  <label>Date: </label>
  <input id="task_date" type="text"/>
</div>
<button id="save_task_btn" type="button">Save</button>
<table id="tasks_table">
  <thead>
    <tr>
      <th>Done</th>
      <th>Name</th>
      <th>Date</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
<table>

【讨论】:

    【解决方案2】:

    当您在提交表单中调用 buildTable 时,它​​会再次循环整个数组并将元素添加到表中。试试这个,

    var table = document.getElementById("tableBody");
    
    toDoArray = [];
    
    
    function buildTable(){
    addToStorage();
    var retrievedTaskObject = localStorage.getItem("task");
    var parsedObject = JSON.parse(retrievedTaskObject);
    var addTheTaskName = parsedObject.taskName;
    var addTheTaskDate = parsedObject.taskDate;
    
    for(i=0; i < toDoArray.length; i++){
      addTaskToTable(parsedObject[i]);
    }
    
    
    
    }
    
    function addTaskToTable(obj){
      var row = table.insertRow(0);
      var cellName = row.insertCell(0);
      var cellDate = row.insertCell(1);
      var cellId = row.insertCell(2);
      var cellCheck = row.insertCell(3);
      cellName.innerHTML= obj.name;
      cellDate.innerHTML= obj.date;
      var checkStuff = "<input type='checkbox'>";
      cellCheck.innerHTML = checkStuff;
    
    }
    
    function submitForm(name,date) {
        var addTaskName = document.getElementById("taskName").value;
        var addTaskDate = document.getElementById("dateTask").value;
        var taskSomething = getTaskObj(addTaskName,addTaskDate);
          toDoArray.push(taskSomething);
          addTaskToTable(taskSomething);
    };
    
    function getTaskObj(taskName,taskData){
    var taskObject = {
            name: taskName,
            date: taskData,
          };
     return taskObject;
    }
    
    function addToStorage(){
      var storedArray = JSON.stringify(toDoArray);
      localStorage.setItem("task",storedArray);
      }
    

    【讨论】:

    • 这解决了您的问题吗?还是无法继续?
    • 解决了这个问题!谢谢!现在我将如何在刷新后加载保存的表?调用我已经 onload 的函数之一,还是需要创建一个新函数? (这似乎会搞砸......
    猜你喜欢
    • 2016-07-05
    • 2014-07-02
    • 2013-05-10
    • 1970-01-01
    • 2013-02-19
    • 2015-07-17
    • 2022-10-20
    • 2014-05-23
    • 2016-07-23
    相关资源
    最近更新 更多