You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于IndexedDB的JavaScript待办列表日期显示异常求助

解决待办列表日期显示一致的问题

你的问题核心是没有把用户选择的日期和待办项一起存入数据库,反而在渲染每个条目时都读取当前日期输入框的数值,所以所有条目都会显示同一个日期,和添加时选择的日期无关。

下面是具体的修改步骤:

1. 修改添加逻辑,存储用户选择的日期

首先更新添加待办的函数,把用户选的日期也传入数据库存储:

function addTodo() {
    var todo = document.getElementById("todo");
    var datePicker = document.getElementById("date");
    // 检查是否选择了日期
    if (!datePicker.value) {
        document.getElementById("ausgabe").innerHTML = "<br/><br/> 请选择日期!";
        return;
    }
    html5rocks.indexedDB.addTodo(todo.value, datePicker.value);
    todo.value = "";
    datePicker.value = ""; // 清空日期输入框
}

然后修改数据库的添加方法,新增存储日期的字段:

html5rocks.indexedDB.addTodo = function(todoText, todoDate) {
  var db = html5rocks.indexedDB.db;
  var trans = db.transaction(["todo"], "readwrite");
  var store = trans.objectStore("todo");

  var data = 
  {
      "text": todoText,
      "timeStamp": new Date().getTime(),
      "dueDate": todoDate // 存储用户选择的日期
  };

  var request = store.put(data);

  request.onsuccess = function(e) 
  {
      html5rocks.indexedDB.getAllTodoItems();
  };

  request.onerror = function(e) 
  {
      console.log("Error Adding: ", e);
  };
};

2. 修改渲染逻辑,使用存储的日期

更新渲染函数,不再读取输入框的日期,而是从数据库存储的条目里取出对应日期:

function renderTodo(row) {
    // 从当前条目的数据里取出存储的日期
    const dt = new Date(row.dueDate);
    const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };

    if(row.text.trim() == "") {
        document.getElementById("ausgabe").innerHTML = "<br/><br/> 请输入任务内容!";
    } else {
        document.getElementById("ausgabe").innerHTML = "";
        // 使用存储的日期格式化显示
        var input_date = "  " + dt.toLocaleDateString([], options) + ": " + row.text; 

        var list = document.getElementById("list");
        var container = document.createElement("container");
        var button = document.createElement("button");
        button.type = "button";
        button.innerText = "X";

        button.addEventListener("click", function() {
            html5rocks.indexedDB.deleteTodo(row.timeStamp);
        },  false);

        container.appendChild(document.createElement("br"));
        container.appendChild(document.createElement("br"));
        container.appendChild(button);
        container.appendChild(document.createTextNode(input_date));
        container.appendChild(document.createElement("br"));
        list.appendChild(container);
   }
}

3. 升级数据库版本

因为新增了存储字段,需要修改数据库版本号触发更新:

html5rocks.indexedDB.open = function() {
  var version = 2; // 版本号从1改为2
  var request = indexedDB.open("todos", version);

  request.onupgradeneeded = function(e) {
    var db = e.target.result;

    e.target.transaction.onerror = html5rocks.indexedDB.onerror;

    if(db.objectStoreNames.contains("todo")) {
      db.deleteObjectStore("todo"); // 删除旧仓库,创建新的(如果需要保留旧数据,可额外做数据迁移)
    }

    var store = db.createObjectStore("todo",
      {keyPath: "timeStamp"});
  };

  // 其余代码保持不变...
};

修改完成后,每个待办项添加时都会把用户选择的日期存入数据库,渲染时直接读取对应条目的日期,就不会出现所有条目日期一致的问题了。

内容的提问来源于stack exchange,提问作者mccutter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:40:56