HTML5系列(8)-- 离线应用指南

前端技术探索系列:HTML5 离线应用指南 🌐

致读者:构建可靠的离线体验 👋

前端开发者们,

在现代 Web 开发中,离线应用已成为提升用户体验的重要组成部分。今天,我们将探索 HTML5 提供的离线技术,包括应用缓存、Service Worker 和离线存储。

应用缓存基础 🚀

manifest 文件

CACHE MANIFEST
# 版本号
# v1.0.0CACHE:
# 缓存的文件列表
/index.html
/styles.css
/scripts.js
/images/logo.pngNETWORK:
# 需要在线访问的资源
/api/FALLBACK:
# 离线时的替代资源
/ /offline.html

缓存状态与更新机制

window.addEventListener('load', () => {const appCache = window.applicationCache;appCache.addEventListener('cached', () => {console.log('所有资源已缓存');});appCache.addEventListener('updateready', () => {if (appCache.status === window.applicationCache.UPDATEREADY) {// 更新缓存并重新加载页面appCache.swapCache();window.location.reload();}});appCache.addEventListener('error', () => {console.error('缓存更新失败');});
});

Service Worker 深入解析 🔧

离线拦截与缓存策略

// 注册 Service Worker
if ('serviceWorker' in navigator) {navigator.serviceWorker.register('/sw.js').then(registration => {console.log('Service Worker 注册成功:', registration);}).catch(error => {console.error('Service Worker 注册失败:', error);});
}// sw.js 文件
self.addEventListener('install', event => {event.waitUntil(caches.open('v1').then(cache => {return cache.addAll(['/','/index.html','/styles.css','/scripts.js','/images/logo.png']);}));
});self.addEventListener('fetch', event => {event.respondWith(caches.match(event.request).then(response => {return response || fetch(event.request);}));
});

后台同步

self.addEventListener('sync', event => {if (event.tag === 'sync-data') {event.waitUntil(syncData());}
});function syncData() {// 执行数据同步逻辑return fetch('/sync', {method: 'POST',body: JSON.stringify({ /* 数据 */ })}).then(response => {if (!response.ok) {throw new Error('同步失败');}return response.json();});
}

离线存储技术 📦

IndexedDB 数据存储

// 打开数据库
const request = indexedDB.open('myDatabase', 1);request.onupgradeneeded = event => {const db = event.target.result;const objectStore = db.createObjectStore('notes', { keyPath: 'id', autoIncrement: true });objectStore.createIndex('title', 'title', { unique: false });
};request.onsuccess = event => {const db = event.target.result;const transaction = db.transaction(['notes'], 'readwrite');const objectStore = transaction.objectStore('notes');// 添加数据const note = { title: '离线笔记', content: '这是一个离线存储的示例。' };const addRequest = objectStore.add(note);addRequest.onsuccess = () => {console.log('笔记已添加');};
};request.onerror = event => {console.error('数据库打开失败:', event.target.errorCode);
};

数据同步策略

function syncIndexedDB() {// 获取所有数据并同步到服务器const request = indexedDB.open('myDatabase');request.onsuccess = event => {const db = event.target.result;const transaction = db.transaction(['notes'], 'readonly');const objectStore = transaction.objectStore('notes');objectStore.getAll().onsuccess = event => {const notes = event.target.result;fetch('/sync-notes', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify(notes)}).then(response => {if (!response.ok) {throw new Error('同步失败');}console.log('数据同步成功');}).catch(error => {console.error('同步错误:', error);});};};
}

实践项目:离线 Web 应用 🛠️

项目概述

我们将创建一个简单的离线笔记应用,用户可以在没有网络连接的情况下查看和编辑笔记。应用将使用 Service Worker 和 IndexedDB 来实现离线功能。

项目实现

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>离线笔记应用</title><link rel="stylesheet" href="styles.css">
</head>
<body><h1>离线笔记</h1><form id="note-form"><input type="text" id="note-title" placeholder="笔记标题" required><textarea id="note-content" placeholder="笔记内容" required></textarea><button type="submit">保存笔记</button></form><ul id="notes-list"></ul><script src="scripts.js"></script>
</body>
</html>
// scripts.js
document.getElementById('note-form').addEventListener('submit', event => {event.preventDefault();const title = document.getElementById('note-title').value;const content = document.getElementById('note-content').value;saveNote({ title, content });
});function saveNote(note) {const request = indexedDB.open('myDatabase');request.onsuccess = event => {const db = event.target.result;const transaction = db.transaction(['notes'], 'readwrite');const objectStore = transaction.objectStore('notes');objectStore.add(note).onsuccess = () => {console.log('笔记已保存');displayNotes();};};
}function displayNotes() {const request = indexedDB.open('myDatabase');request.onsuccess = event => {const db = event.target.result;const transaction = db.transaction(['notes'], 'readonly');const objectStore = transaction.objectStore('notes');objectStore.getAll().onsuccess = event => {const notes = event.target.result;const notesList = document.getElementById('notes-list');notesList.innerHTML = notes.map(note => `<li>${note.title}: ${note.content}</li>`).join('');};};
}// 初始化显示笔记
displayNotes();

写在最后 🌟

通过本文的学习,我们了解了如何使用 HTML5 的离线技术来构建可靠的 Web 应用。无论用户是否在线,应用都能提供一致的体验。

进一步学习资源 📚

  • MDN Web Docs: Application Cache
  • Google Developers: Service Worker
  • IndexedDB API 使用指南

如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小家电出海,沃丰科技助力保障售后服务的及时性与高效性

随着全球化步伐的加快&#xff0c;小家电行业也逐渐迈向国际市场&#xff0c;面向全球消费者提供服务。然而&#xff0c;跨国界的销售和服务挑战也随之而来&#xff0c;尤其是售后服务的及时性与高效性成为了企业亟需解决的问题。沃丰科技凭借其全渠道在线客服、工单系统和视频…

Vulnhub靶场 Matrix-Breakout: 2 Morpheus 练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 文件上传2. 提权 0x04 总结 0x00 准备 下载连接&#xff1a;https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova 介绍&#xff1a; This is the second in the Matrix-Br…

美畅物联丨智能监控,高效运维:视频汇聚平台在储能领域的实践探索

在当今全球能源格局不断变化的大背景下&#xff0c;对清洁能源的需求正以惊人的速度增长。储能项目作为平衡能源供需、提升能源利用效率的关键环节&#xff0c;其规模和复杂度也在不断攀升。在储能项目的运营管理过程中&#xff0c;安全监控、设备运维以及数据管理等方面面临着…

提升用户体验、创新产品与高效运营,企业发展三驾马车

​在当今竞争激烈的市场环境中&#xff0c;企业要想脱颖而出并持续发展&#xff0c;需同时在提升用户体验、推动产品创新以及实现内部高效运营方面下功夫。 提升用户体验至关重要。它能提高用户满意度和忠诚度&#xff0c;增加用户口碑与推荐&#xff0c;提升企业品牌形象。可通…

基于ZooKeeper搭建Hadoop高可用集群

ZooKeeper搭建Hadoop高可用集群 在之前安装的Hadoop3.3.6集群中HDFS NameNode 和 YARN ResourceManager 都是单节点&#xff0c;集群不具有高可用性。 HDFS 高可用架构 HDFS 高可用架构主要组件&#xff1a; Active NameNode 和 Standby NameNode&#xff1a; 两台 NameNode…

机器学习—学习过程

给定训练集构建决策树的过程有几个步骤。 给出了一组由十个猫和狗的例子组成的训练集&#xff0c;决策树学习的第一步是我们必须决定在根节点使用什么特性&#xff0c;这是决策树顶部的第一个节点&#xff0c;通过一个算法&#xff0c;假设我们决定选择根节点中的特性&#xf…

矩阵转置        ‌‍‎‏

矩阵转置 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入一个n行m列的矩阵A&#xff0c;输出它的转置 A T A^T AT。 输入 第一行包含两个整数n和m&#xff0c;表示矩阵A的行数和列数。…

GPT 1到4代的演进笔记

1. GPT-1 标题是 Improving Language Understanding by Generative Pre-Training. 发表于 2018.02, 比 bert(发布于 2018.10) 早了半年. 1.1 动机 困难:NLU 任务是多样的, 有 {textual entailment, question answering, semantic similarity assessment, document classifica…

JDK17 下载与安装

下载安装包 针对不同的操作系统, 需要下载对应版本的 JDK. 如果电脑是 Windows32 位的, 建议重装系统, 重装成 64 位的操作系统. 因为 Java 从 9 版本开始, 就已经不提供 32 位版本的安装包了. 官网下载 官网下载链接 需要登录 Oracle 账号才能下载. 账号: 2872336204qq.c…

51c视觉~YOLO~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12512597 1、Yolo8 1.1、检测PCB元件 技术世界正在以惊人的速度发展&#xff0c;而这种转变的核心是一个革命性的工具 — 计算机视觉。它最有趣的应用之一是电子印刷电路板 &#xff08;PCB&#xff09; 的检测和分析。本文…

python学习笔记15 python中的类

上一篇我们介绍了python中的库 &#xff0c;学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库&#xff0c;常见的内置库&#xff08;random、hashlib、json、时间、os&#xff09; 这一篇我们来看一下python中的类 创建一个类 class 类的名称():de…

Day28 买卖股票的最佳时机 跳跃游戏 跳跃游戏 II K 次取反后最大化的数组和

贪心算法 part02 122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 求最大利润 将每天的正利润加和 public int maxProfit(int[] prices) {int totalPrices 0;for(int i0;i<prices.length;i){if(i<prices.length-1&&prices[i1]>prices[…

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…

『数据结构』空间复杂度

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

多模态COGMEN详解

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波&#xff0c;这个案例我们使用输入捕获功能&#xff0c;来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑&#xff0c;检查测试的结果。 如何测量 1、输入捕获功能主要是&#xff1a;测量输入通道的上升沿和下降沿 2、让第一个…

重生之我在异世界学编程之C语言:操作符篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文1. 算术操作符2. 关系&#xff0…

STM32 进阶 定时器 2基本定时器 基本定时器中断案例:LED闪烁

基本定时器 基本定时器TIM6和TIM7各包含一个16位自动装载计数器&#xff0c;由各自的可编程预分频器驱动。 这2个定时器是互相独立的&#xff0c;不共享任何资源。 这个2个基本定时器只能向上计数&#xff0c;由于没有外部IO&#xff0c;所以只能计时&#xff0c;不能对外部…

OpenVas安装步骤及报错问题

安装步骤 1、更新系统 apt update && apt upgrade && apt dist-upgrade 2、安装openvas apt-get install openvas 3、初始化 gvm-setup 时间要很久 4、检查安装结果 gvm-check-setup 安装成功 5、设置用户名和密码&#xff0c;都为admin sudo runuse…

深度学习之pth转换为onnx时修改模型定义‌

文章目录 概述实现步骤python代码 概述 在将PyTorch模型&#xff08;.pth文件&#xff09;转换为ONNX格式时&#xff0c;通常的转换过程是通过torch.onnx.export函数来实现的。这个过程主要是将PyTorch模型的计算图导出为ONNX格式&#xff0c;以便在其他框架或环境中使用。 在…