如何在工作日计划应用中实现本地存储与数据持久化


如何在工作日计划应用中实现本地存储与数据持久化

本教程详细介绍了如何在j*ascript工作日计划应用中使用`localstorage`实现数据持久化。我们将学习如何初始化、保存和重新加载日程事件数据,确保用户在刷新页面后仍能看到之前输入的日程安排,并优化数据存储逻辑以避免重复和确保数据更新。

在现代Web应用开发中,数据持久化是一个常见需求,尤其对于像日程计划器这类需要保存用户输入的应用。Web Storage API,特别是localStorage,提供了一种在浏览器端存储键值对数据的简便方法,并且这些数据在浏览器会话结束后仍然保留,即实现了页面重载后的数据持久化。本教程将指导您如何在工作日计划应用中集成和优化localStorage的使用。

1. 理解 localStorage 的基本操作

localStorage 是一个全局对象,它提供了以下几个核心方法:

  • localStorage.setItem(key, value): 将数据保存到localStorage。key和value都必须是字符串。
  • localStorage.getItem(key): 从localStorage获取数据。如果key不存在,则返回null。
  • localStorage.removeItem(key): 从localStorage删除指定key的数据。
  • localStorage.clear(): 清除localStorage中的所有数据。

由于localStorage只能存储字符串,因此在存储J*aScript对象或数组时,需要使用JSON.stringify()将其转换为JSON字符串;在读取时,则需要使用JSON.parse()将其解析回J*aScript对象或数组。

2. 初始化与数据加载

为了在页面加载时显示之前保存的日程,我们需要在$(document).ready()事件中执行以下操作:

MarketingBlocks AI MarketingBlocks AI

AI营销助理,快速创建所有的营销物料。

MarketingBlocks AI 27 查看详情 MarketingBlocks AI
  1. 从localStorage尝试获取保存的数据。
  2. 如果数据存在,将其解析为J*aScript数组。
  3. 遍历该数组,并将每个日程事件的内容填充到对应的textarea元素中。
// ... 其他代码 ...

$(document).ready(function() {
    var scheduleContent = []; // 用于存储日程数据的内存数组

    // 函数:从localStorage加载日程并渲染到UI
    function loadSchedule() {
        var getLocalStorageData = JSON.parse(localStorage.getItem("schedule-items"));

        if (getLocalStorageData !== null) {
            scheduleContent = getLocalStorageData; // 更新内存数组
            // 遍历加载的数据,并填充到对应的textarea元素中
            scheduleContent.forEach(function(item) {
                // 确保通过正确的ID找到textarea并设置其值
                $("#" + item["input-id"]).val(item["input-value"]);
            });
        }
    }

    // 页面加载时调用,以显示之前保存的日程
    loadSchedule();

    // ... 其他代码 ...
});

3. 优化数据保存逻辑

原始代码在保存时简单地将新数据push到数组中,这可能导致重复条目。为了确保每个时间段只有一个日程,我们需要在保存时检查该时间段是否已有日程:

  1. 获取当前textarea的值和ID。
  2. 检查scheduleContent数组中是否已存在具有相同input-id的条目。
  3. 如果存在,则更新该条目的input-value。
  4. 如果不存在,则添加一个新条目。
  5. 如果textarea的值为空,则应从scheduleContent中移除对应的条目。
  6. 将更新后的scheduleContent数组转换为JSON字符串并保存到localStorage。
// ... 其他代码 ...

$(document).ready(function() {
    // ... loadSchedule() 和 loadSchedule() 调用 ...

    // 保存按钮点击事件处理
    $("button").on("click", function() {
        var container = $(this).parent().parent();
        // 获取textarea的值,并去除首尾空格
        var inputValue = container.find("textarea").val().trim();
        // 获取textarea的ID
        var inputId = container.find("textarea").attr("id");

        if (inputValue !== "") {
            // 查找是否已存在相同input-id的日程
            var existingIndex = scheduleContent.findIndex(item => item["input-id"] === inputId);

            if (existingIndex > -1) {
                // 如果存在,更新现有日程的值
                scheduleContent[existingIndex]["input-value"] = inputValue;
            } else {
                // 如果不存在,添加新日程
                var textObj = {
                    "input-id": inputId,
                    "input-value": inputValue
                };
                scheduleContent.push(textObj);
            }
        } else {
            // 如果输入值为空,则从日程列表中移除该项(如果存在)
            scheduleContent = scheduleContent.filter(item => item["input-id"] !== inputId);
        }

        // 将更新后的日程数组保存到localStorage
        localStorage.setItem("schedule-items", JSON.stringify(scheduleContent));

        // 可选:提供用户反馈
        alert("日程已保存!");
    });

    // ... 时间块颜色逻辑 ...
});

4. 完整的J*aScript实现

将上述加载和保存逻辑与原有的时间显示和时间块颜色标记功能结合,得到一个完整且功能优化的J*aScript文件:

// 实时时钟显示
const clock = document.getElementById("clock");
setInterval(() => {
    const now = moment();
    const readable = now.format("dddd, MMMM Do YYYY, h:mm:ss a");
    clock.textContent = readable;
}, 1000);

// DOM加载完成后执行
$(document).ready(function() {
    var scheduleContent = []; // 用于存储日程数据的内存数组

    // 函数:从localStorage加载日程并渲染到UI
    function loadSchedule() {
        // 尝试从localStorage获取数据并解析
        var getLocalStorageData = JSON.parse(localStorage.getItem("schedule-items"));

        if (getLocalStorageData !== null) {
            scheduleContent = getLocalStorageData; // 更新内存数组
            // 遍历加载的数据,并填充到对应的textarea元素中
            scheduleContent.forEach(function(item) {
                // 使用jQuery选择器通过ID找到textarea并设置其值
                $("#" + item["input-id"]).val(item["input-value"]);
            });
        }
    }

    // 页面加载时调用,以显示之前保存的日程
    loadSchedule();

    // 保存按钮点击事件处理
    $("button").on("click", function() {
        var container = $(this).parent().parent();
        // 获取textarea的值,并去除首尾空格,确保数据干净
        var inputValue = container.find("textarea").val().trim();
        // 获取textarea的ID,用于唯一标识日程条目
        var inputId = container.find("textarea").attr("id");

        if (inputValue !== "") {
            // 查找是否已存在相同input-id的日程
            var existingIndex = scheduleContent.findIndex(item => item["input-id"] === inputId);

            if (existingIndex > -1) {
                // 如果存在,更新现有日程的值
                scheduleContent[existingIndex]["input-value"] = inputValue;
            } else {
                // 如果不存在,添加新日程对象
                var textObj = {
                    "input-id": inputId,
                    "input-value": inputValue
                };
                scheduleContent.push(textObj);
            }
        } else {
            // 如果输入值为空,则从日程列表中移除该项(如果存在)
            scheduleContent = scheduleContent.filter(item => item["input-id"] !== inputId);
        }

        // 将更新后的日程数组转换为JSON字符串并保存到localStorage
        localStorage.setItem("schedule-items", JSON.stringify(scheduleContent));

        // 可选:提供用户保存成功的反馈
        alert("日程已保存!");
    });

    // 时间块颜色标记逻辑
    var elements = $(".time-block");
    var d = new Date();
    var h = d.getHours(); // 获取当前小时 (0-23)

    for (let i = 0; i < elements.length; i++) {
        var t = parseInt(elements[i].getAttribute("data-hour")); // 获取时间块对应的小时

        if (h < t) {
            // 当前小时小于时间块小时,标记为未来 (绿色)
            elements[i].classList.add('future');
            elements[i].classList.remove('past', 'present');
        } else if (h > t) {
            // 当前小时大于时间块小时,标记为过去 (灰色)
            elements[i].classList.add('past');
            elements[i].classList.remove('future', 'present');
        } else if (h === t) {
            // 当前小时等于时间块小时,标记为现在 (红色)
            elements[i].classList.add('present');
            elements[i].classList.remove('future', 'past');
        }
        // 原始代码中的 'else if (h > 16 && h < 9)' 逻辑上不可能,已移除。
        // 如果需要处理跨天或特定时间段的特殊颜色,应重新设计逻辑。
    }
});

5. 注意事项与最佳实践

  • 数据结构设计: 对于更复杂的应用,您可能需要更精细的数据结构,例如包含日期信息,以便管理多天的日程。
  • 错误处理: JSON.parse()在处理无效JSON字符串时会抛出错误。在实际应用中,您可能需要使用try-catch块来处理这种情况,以防止应用崩溃。
  • 用户体验: 除了alert(),可以考虑更友好的用户反馈方式,例如短暂显示“保存成功”的消息或改变保存按钮的样式。
  • 存储限制: localStorage的存储容量有限(通常为5-10MB,具体取决于浏览器)。对于大量数据,应考虑服务器端存储或其他客户端存储方案(如IndexedDB)。
  • 安全性: localStorage不适合存储敏感信息,因为它容易被客户端脚本访问。
  • 浏览器兼容性: localStorage已被所有现代浏览器广泛支持,但在极少数旧版浏览器中可能需要回退方案。

通过以上步骤,您的工作日计划应用将能够有效地利用localStorage实现日程数据的持久化,为用户提供更稳定和便捷的使用体验。

以上就是如何在工作日计划应用中实现本地存储与数据持久化的详细内容,更多请关注其它相关文章!


# java  # 转换为  # 是一个  # 如何在  # 数据结构  # 移除  # 将其  # 遍历  # 不存在  # 加载  # 键值对  # 浏览器端  # 应用开发  # ai  # ssl  # 浏览器  # json  # js  # jquery  # javascript  # 点击事件  # 娄底网站优化询问报价  # 如何使用360推广网站  # seo刷词工具开  # 线下校园营销推广策略  # 甘肃正规网站建设技巧  # 美甲关键词排名查询  # 东莞网站建设实例图纸  # 荆州市seo优化  # 广东网站制作优化  # seo中间长尾词  # 值为 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: Vue 3中独立响应式实例的创建与应用  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  一点万象签到领积分指南  t3出行如何使用微信支付  解决C#跨线程访问XML对象的异常 安全的并发XML处理模式  mysql怎么导入sql文件_mysql导入sql文件的方法与技巧  sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解  mysql中如何配置字符集和排序规则_mysql字符集排序配置  c++如何使用std::thread::join和detach_c++线程生命周期管理  《豆瓣》私信用户方法  在Dash应用中自定义HTML标题和网站图标  《下一站江湖2》独孤剑诀习得方法  263企业邮箱如何设置邮件转发功能  口腔诊所管理软件推荐  圆通快递官网入口查询单号 手机版官方查询入口  Animex动漫社社登录官网 Animex动漫社资源社入口直达  苹果SE如何开启单手模式_苹果SE单手操作功能  支付宝登录刷脸不是本人如何解决  原子笔记app误删找回教程  如何通过settings.json个性化您的VS Code体验  鸿蒙单条备忘录如何加密  在Flask应用中安全高效地更新SQLAlchemy用户数据  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  FotoBalloon图片左右镜像教程  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  Go语言反射机制:如何访问被嵌入结构体遮蔽的方法  Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】  iPhone12是否要更新ios16  《小宇宙》标记不友善评论方法  Yandex俄罗斯搜索引擎官网入口 Yandex网页端直接访问  CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化  抖音网页版地址直接进入_抖音网页版在线观看入口  《飞猪旅行》购买汽车票方法  如何在CSS中设置背景图像:一个全面指南  海棠阅读登录教程_详细讲解海棠登录操作  MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  邮编号码查询app有哪些_邮编号码查询推荐app及使用体验  《单词速记宝》设置学习计划方法  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享  126邮箱申请入口官网_126邮箱注册免费登录2025  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  百度网盘网页入口链接分享 百度网盘官网入口网页登录  mysql如何配置从库只读_mysql从库只读设置方法  在Spring Boot Thymeleaf中利用布尔属性实现容器的条件显示  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法  J*aScript字符串_Unicode处理 

 2025-11-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.