0

我刚刚开始了关于 Javascript 的 Udemy 课程,第一个项目是创建任务列表。我按照教程很好地创建了它,但我想向它添加一些功能。添加新任务时,我想添加将其标记为完成的功能。

我一直在尝试如何使用 css (text-decoration: line-through) 来做到这一点,但遇到了死胡同。一旦单击标记为“完成”的按钮,就会调用一个函数来检查“检查项”类的列表项。然后我添加类名“check-item-style”,它将直通应用于单击的列表项。如果您能帮我将其插入本地存储,并在浏览器重新打开后从本地存储中“获取”。

我会尽量保持代码尽可能简短。如果可能的话,只有香草 javascript!我尝试做一个代码片段,但效果不是很好(可能是由于本地存储不可用),所以我在下面包含了短代码。如果没有所有库,某些代码将无法正常工作,因此必须包含抱歉!

// Define UI Vars
const form = document.querySelector("#task-form");
const taskList = document.querySelector(".collection");
const taskInput = document.querySelector("#task");

//Event Listeners
form.addEventListener("submit", addTask);
taskList.addEventListener("click", checkTask);
document.addEventListener("DOMContentLoaded", getTasks);

function getTasks() {
  if (localStorage.getItem("tasks") === null) {
    tasks = [];
  } else {
    tasks = JSON.parse(localStorage.getItem("tasks"));
  }
  tasks.forEach(function(task) {
    const li = document.createElement("li");
    li.className = "collection-item";
    li.appendChild(document.createTextNode(task));
    const linkCheck = document.createElement("a");
    linkCheck.className = "check-item secondary-content";
    linkCheck.innerHTML = '<i class="fa fa-check"></i>';
    li.appendChild(linkCheck);
    taskList.appendChild(li);
  });
}

function addTask(e) {
  if (taskInput.value === "") {
    alert("Add a task");
  } else {
    const li = document.createElement("li");
    li.className = "collection-item";
    li.appendChild(document.createTextNode(task));
    const linkCheck = document.createElement("a");
    linkCheck.className = "check-item secondary-content";
    linkCheck.innerHTML = '<i class="fa fa-check"></i>';
    li.appendChild(linkCheck);

    taskList.appendChild(li);
    storeTaskInLocalStorage(taskInput.value);
    //Clear input
    taskInput.value = "";
  }

  e.preventDefault();
}

function storeTaskInLocalStorage(task) {
  let tasks;
  if (localStorage.getItem("tasks") === null) {
    tasks = [];
  } else {
    tasks = JSON.parse(localStorage.getItem("tasks"));
  }
  tasks.push(task);

  localStorage.setItem("tasks", JSON.stringify(tasks));
}

function checkTask(e) {
  let check = e.target.parentElement.parentElement;
  if (e.target.parentElement.classList.contains("check-item")) {
    check.className = "check-item-style";
    addStylingToLocalStorage(check.className);
  }
}

function addStylingToLocalStorage() {
  //Please help here
}
.check-item-style {
  text-decoration: line-through;
  padding: 10px;
  padding-right: 20px;
  padding-left: 20px;
  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
  margin: 0px;
}
<!DOCTYPE html>
<html lang="en">
  <body>
    <script
      src="https://code.jquery.com/jquery-3.5.1.js"
      integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc="
      crossorigin="anonymous"
    ></script>
    <link
      rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"
    />
    <link
      href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
      rel="stylesheet"
      integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN"
      crossorigin="anonymous"
    />
    <title>Task List</title>
    <link rel="stylesheet" href="stylesheet.css" />
    <script src="app.js" defer></script>
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"
      defer
    ></script>
    <div class="container">
      <form id="task-form">
        <div>
          <input type="text" name="task" id="task" />
          <label for="task">New Task</label>
        </div>
        <input type="submit" value="Add Task" class="btn" />
      </form>
      <div>
        <ul class="collection"></ul>
      </div>
    </div>
  </body>
</html>

4

1 回答 1

0

有一种简单的方法可以做到这一点,而无需存储CSS In localStorage。现在,如果你的任务列表是打扫、睡觉和阅读,那么你的 JSON 看起来像这样:

[
    "Cleaning",
    "Sleeping",
    "Reading"
]

每个项目只是一个字符串。如果要跟踪已检查的内容,请从localStorage. 这是一个示例 JSON 结构。

[
    {
        "name": "Cleaning",
        "done": true
    },
    {
        "name": "Sleeping",
        "done": true
    },
    {
        "name": "Reading",
        "done": false
    }
]

如果您重新加载页面,您只需要根据done属性设置任务样式。

编辑您的存储功能:

function storeTaskInLocalStorage(task, done) {
  let tasks;
  if (localStorage.getItem('tasks') === null) { 
    tasks = [];
  } else {
    tasks = JSON.parse(localStorage.getItem('tasks'));
  }
  tasks.push({
    name: task,
    done: done
  });

  localStorage.setItem('tasks', JSON.stringify(tasks));
}
于 2020-05-12T20:30:14.783 回答