HTML5本地存储不完全指南

2023-05-16

编辑推荐:这篇文章来自于黑客志,对HTML5的本次存储方式进行了非常全面的介绍和分析,对于学习HTML5的开发者来说,不容错过哦。 

历史  

在HTML5本地存储之前,如果我们想在客户端保存持久化数据,有这么几个选择: 

  1. HTTP cookie。HTTP cookie的缺点很明显,最多只能存储4KB的数据,每个HTTP请求都会被传送回服务器,明文传输(除非你使用SSL)。
  2. IE userData。userData是微软在上世纪90年代的浏览器大战时推出的本地存储方案,借助DHTML的behaviour属性来存储本地数据, 允许每个页面最多存储64K数据,每个站点最多640K数据,userData的缺点显而易见,它不是Web标准的一部分,除非你的程序只需要支持IE, 否则它基本没什么用处。
  3. Flash cookie。Flash cookie的名字有些误导,它实际上和HTTP cookie并不是一回事,或许它的名字应该叫做"Flash本地存储”,Flash cookie默认允许每个站点存储不超过100K的数据,如果超出了,Flash会自动向用户请求更大的存储空间,借助Flash的 ExternalInterface接口,你可以很轻松地通过Javascript操作Flash的本地存储。Flash的问题很简单,就是因为它是 Flash。
  4. Google Gears。Gears是Google在07年发布的一个开源浏览器插件,旨在改进各大浏览器的兼容性,Gears内置了一个基于SQLite的嵌入式 SQL数据库,并提供了统一API对数据库进行访问,在取得用户授权之后,每个站点可以在SQL数据库中存储不限大小的数据,Gears的问题就是 Google自己都已经不用它了。
现状  

我们现在通常所说的HTML5本地存储,一般指的是 Web Storage规范 ,这个标准曾经是HTML5规范的一部分,但后来因为种种原因从HTML5规范中分离了出来。但是除了Web Storage,HTML5的本地存储标准还有另外2个竞争者:Web SQL Database和IndexedDB。下面就让我们依次来看看这3个规范吧。 

Web Storage  

Web Storage是目前得到支持最广泛的HTML5本地存储规范:IE 8+、FF 3.5+、Safari 4+、Chrome 4+、Opera 10.5+,以及iPhone 2+和Android 2+都已经支持Web Storage,要判断你的浏览器是否支持Web Storage,可以使用下面这个函数: 
代码 
  1. function supports_html5_storage() {  
  2.     try {  
  3.         return 'localStorage' in window && window['localStorage'] !== null;  
  4.     } catch (e) {  
  5.         return false;  
  6.     }  
  7. }  

HTML5 Storage的使用非常简单: 
代码 
  1. var foo = localStorage.getItem("bar");  
  2. // ...  
  3. localStorage.setItem("bar", foo);  

你也可以写成下面这样: 
代码 
  1. var foo = localStorage["bar"];  
  2. // ...  
  3. localStorage["bar"] = foo;  

如果要将某个key从存储空间删除,可以调用removeItem: 
代码 
  1. localStorage.removeItem('foo');  


你也可以像遍历数组那样遍历存储的所有键值对象: 
代码 
  1. for(var i=0; ivar key = localStorage.key(i);  
  2.     console.log(key + ":" + localStorage[key]);  
  3. }  

如果你的程序需要在不同页面访问同一个值,你可能需要了解这个值是否已经被其他页面改变了,这可以通过向浏览器注册storage事件来实现: 
代码 
  1. window.addEventListener('storage', function(e) {  
  2.     console.log(e.key + "'s value is changed from '" +  
  3.         e.oldValue + "' to '" + e.newValue + "' by " + e.url);  
  4. }, false);  
  5.   
  6. //A页面  
  7. localStorage['foo'] = 'bar';  
  8.   
  9. //B页面  
  10. localStorage['foo'] = 'newBar';  

这时你应该会在A页面的Console中看到: 

foo’s value is changed from ‘bar’ to ‘newbar’ by http://localhost/test.html 

要注意的是,storage事件仅仅只是通知你某个键对应的值已经发生了改变,你没有办法在回调中阻止这个改变发生。 

HTML5 Storage看起来不错,那它有没什么缺点呢?好问题。要说HTML5 Storage的缺点,唯一的问题就是它默认的QUOTA只有5MB,并且你没办法通过程序自行或是提示用户来增加存储空间。唯一的办法就是用户自己打开 浏览器的设置,并手动修改QUOTA的大小,如果超出了5MB的限制,你将会遇到一个“QUOTA_EXCEEDED_ERR”的错误。 

Web SQL Database  

Web SQL Database是一个已经废弃的规范,但是鉴于除了IE和Firefox,其他浏览器都已经实现了Web SQL Database,并且它还具有一些HTML5 Storage所不具有的特性,所以还是值得了解一下的。 

Web SQL Database就像它的名字那样,就是一个让你可以在Web上直接使用的SQL数据库,你要做的就是打开数据库,然后执行SQL,和你对Mysql做的事情没什么两样: 
代码 
  1. openDatabase('documents''1.0''Local document storage'5*1024*1024,  
  2. function (db) {  
  3.     db.changeVersion('''1.0', function (t) {  
  4.         t.executeSql('CREATE TABLE docids (id, name)');  
  5.     }, error);  
  6. });  

关于Web SQL Database的更多介绍,可以 参看这篇指南 。 

但是它的缺点也同样明显。最大的问题就出在SQL上,实际上并不存在一种叫做SQL的标准结构化查询语言,我们平常使用的实际上是MS SQL、Oracle SQL、MySQL SQL、postgre SQL或者SQLite SQL(尽管有一个叫做SQL-92的规范,但它基本形同虚设),更进一步,甚至都不存在SQLite SQL,我们使用的实际上是SQLite x.y.z SQL,而这也就是Web SQL Database最大的问题,它无法统一各个浏览器厂商实现的SQL语言,如果你的某条Web SQL查询只能在Chrome上运行,这还能叫做标准吗? 

所以,如果你现在访问 Web SQL Database的规范页面 ,你会在顶部看到这样一则声明: 
这个规范已经陷入了一个僵局:目前的所有实现都是基于同一个SQL后端(SQLite),但是我们需要更多的独立实现来完成标准化,所以除非有厂商愿意独立实现这个规范,否则当前的SQL规范只能采用SQLite的SQL方言,而作为一个标准,这是不可接受的。 

IndexedDB  

最后我们要介绍的就是 IndexedDB 了,相比其他两个规范,目前只有Firefox实现了IndexedDB(顺便提一下, Mozilla表示它们永远不会去实现Web SQL Database ),不过Google已经表示 正在考虑在Chrome中加入IndexDB支持 。 

IndexedDB引入了一个object store的概念,这有点像是一个SQL Database,你可以在“数据库”中存储“记录”,并且每条“记录”可以拥有很多“字段",每个字段都有一个特定的数据类型,你可以选择记录的子集, 并使用“光标”进行遍历,同时object store中的所有变更都是基于“事务”的。 

下面让我们来看一个小例子: 
代码 
  1. var request = window.indexedDB.open("CandyDB",  
  2.                                     "My candy store database");  
  3. request.onsuccess = function(event) {  
  4.   var db = event.result;  
  5.   if (db.version != "1") {  
  6.     // User's first visit, initialize database.  
  7.     var createdObjectStoreCount = 0;  
  8.     var objectStores = [  
  9.       { name: "kids", keyPath: "id", autoIncrement: true },  
  10.       { name: "candy", keyPath: "id", autoIncrement: true },  
  11.       { name: "candySales", keyPath: "", autoIncrement: true }  
  12.     ];  
  13.   
  14.     function objectStoreCreated(event) {  
  15.       if (++createdObjectStoreCount == objectStores.length) {  
  16.         db.setVersion("1").onsuccess = function(event) {  
  17.           loadData(db);  
  18.         };  
  19.       }  
  20.     }  
  21.   
  22.     for (var index = 0; index < objectStores.length; index++) {  
  23.       var params = objectStores[index];  
  24.       request = db.createObjectStore(params.name, params.keyPath,  
  25.                                      params.autoIncrement);  
  26.       request.onsuccess = objectStoreCreated;  
  27.     }  
  28.   }  
  29.   else {  
  30.     // User has been here before, no initialization required.  
  31.     loadData(db);  
  32.   }  
  33. };  

关于Indexed的更多介绍可以参看Mozilla Blog的这篇指南。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5本地存储不完全指南 的相关文章

  • 基于SSM 和 layui 的增删查改

    开发工具 IDEA 2021 WebStorm 2021 Mysql 8 0 开发环境 JDK 8 TomCat 8 5 81 apache maven 3 6 1 技术点 Spring SpringMVC Mybatis Mysql Ht
  • 开发日志:微信公众号网页开发的调试工具

    在这里记录一下开发时有用到的一些工具 VConcole调试工具 手机端的H5调试工具 http debugx5 qq com
  • 兼容ios不支持的日期格式

    前段时间开发了一个关于订单展示的页面 要求根据时间筛选出离当前时间最近的订单信息进行展示 因为服务器返回的时间格式都是 YYYY MM DD 也没想那么多 直接拿过来就用了 在安卓上排序都很正常 在测试的时候发现苹果手机展示的订单根本就没有
  • 企业网上下单订货管理软件源码搭建功能介绍

    网上下单订货管理软件源码搭建功能介绍 订货通订单管理系统APP 一 系统概述和用途 系统基于网络 实现厂家和代理商批发商通过网络下单订货功能 什么是订货通 什么是企业订货管理系统 是一款针对中小型企业通过网络实现 厂家和客户 经销商 批发商
  • innerHTML与XSS攻击

    HTML5为所有元素提供了一个innerHTML属性 既能获取对象的内容又能向对象插入内容 属性值 HTML标签 文本 浏览器会将属性值解析为相应的DOM树 HTML解析器在浏览器中是底层代码比JavaScript方法快很多 同时意味着替换
  • 移动端页面禁止放大缩小

    安卓 在index html文件中添加meta标签 IOS 在 src app vue 中 script 标签内添加代码
  • 滑动指示器导航源码html+css

  • 移动互联网终端的touch事件,touchstart, touchend, touchmove

    前言 如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP 这个页面上肯定是有很多可点击区域的 如果用户触摸到了那些可点击区域怎么办呢 诸如智能手机和平板电脑一类的移动设备通常会有一个电容式触摸屏 capacitive
  • 动态一键换肤实现思路和demo

    前言 浏览器切换样式无非是通过css 总共有以下三种方法 内联style 注入style 注入link 那么我们想要实现一键换肤 那么我们为了剥离干净dom和css 我们只能选择style和link这两种方法 核心思路 在html的head
  • vue+element-ui el-tabs切换面板el-tab-pane切换

    在vue项目中 el tabs在页面的右侧显示 切换面板 下面的内容是正常显示的 效果如下 代码如下 父组件
  • 网页引用Font Awesome图标

    方法一 demo html
  • 如何给证件照换一个背景颜色

    我们在考试报名的时候 经常是不同的考试需要不同的登记照尺寸和背景颜色 但是我们基本上不可能每种颜色的证件照都去拍一张吧 那样也太麻烦成本也太高 所以通过前端实现了一个改变证件照背景颜色的方法 他可以将证件照的背景颜色修改为任意的颜色 而不局
  • Saas-Export项目之部门数据回显(下拉框和单选框回显)

    Saas Export项目之部门数据回显 之前的经验 做数据回显一般就是在数据修改时需要查询出这条信息 然后再将数据拆分每一项逐一赋值在表单上 通常赋值就行 而且都是input type text这种类型的 所有只要在input里增加val
  • HTML5游戏实战(2):90行代码实现捕鱼达人

    捕鱼达人是一款非常流行的游戏 几年里赚取了数以千万的收入 这里借用它来介绍一下用Gamebuilder CanTK开发游戏的方法 其实赚钱的游戏未必技术就很难 今天我们就仅用90来行代码来实现这个游戏 CanTK Canvas ToolKi
  • 表格嵌套与合并

  • 微信小程序:图片高度设置无效问题

    控制台查看元素 显示其style中多了一个没有设置的高度值 找了很久发现是因为image标签设置了mode widthFix 此时高度会自适应 样式中设置高度无效
  • html创建添加地图(超简单)

    1 打开百度地图创建平台 百度地图创建平台 2 根据个人需求改就行了 可加标注 3 点击获取代码 复制下来就可以用了 4 个人用的是HBulider 复制到里面可直接用了 如果有文字显示问题 把编码改成utf 8就行了 5 地图控件位置在网
  • 基于html5的国家历史文物网站的设计与实现-计算机毕业设计源码63653

    目 录 摘 要 Abstract 第 1 章
  • 第8章 多媒体嵌入

    学习目标 了解视频 音频嵌入技术 能够总结HTML5视频 音频嵌入技术的优点 了解常用的视频文件格式和音频文件格式 能够归纳HTML5支持的视频和音频格式 掌握HTML5中视频的嵌入方法 能够在HTML5页面中添加视频文件 掌握HTML5中
  • 第8章 多媒体嵌入

    学习目标 了解视频 音频嵌入技术 能够总结HTML5视频 音频嵌入技术的优点 了解常用的视频文件格式和音频文件格式 能够归纳HTML5支持的视频和音频格式 掌握HTML5中视频的嵌入方法 能够在HTML5页面中添加视频文件 掌握HTML5中

随机推荐

  • mysql 转换NULL数据方法

    使用mysql查询数据库 xff0c 当执行left join时 xff0c 有些关联的字段内容是NULL xff0c 因此获取记录集后 xff0c 需要对NULL的数据进行转换操作 本文将提供一种方法 xff0c 可以在查询时直接执行转换
  • shell 使用数组作为函数参数的方法

    因工作需要 xff0c 需要使用shell开发一些小工具 xff0c 当使用数组作为函数参数时 xff0c 发现只能传递数组的第一个元素 xff0c 数组后面的元素不能传递到函数内 span class hljs shebang bin b
  • HTML5按比例缩略图片并上传的实例

    上传图片并生成缩略图 xff0c 一般是先把图片上传到服务器 xff0c 然后服务端再对图片进行缩略处理 xff0c 生成缩略图片 上传到服务器后再生成缩略图有两个缺点 xff1a 1 图片尺寸如果过大 xff0c 上传到服务器的时间会较长
  • 利用自定义web-font实现数据防采集

    web font介绍 web font是CSS3中的一种标记 64 font face xff0c 在 64 font face声明里 xff0c 你可以声明一种字体 xff0c 指定这种字体字体库文件从网络某个地址下载 具体写法如下 xf
  • Linux alias命令的使用

    Linux alias命令用来设置指令的别名 xff0c 对一些较长的命令进行简化 使用alias时 xff0c 必须使用单引号将原来的命令包含 xff0c 防止特殊字符导致错误 1 设置别名 span class hljs keyword
  • MongoDB 批量添加记录中不存在的字段

    MongoDB是基于分布式文件存储的数据库 xff0c 与关系型数据库不同 xff0c 记录中的字段数量可以各不相同 本文将介绍如何对MongoDB记录中不存在的字段进行批量添加并赋值 MongoDB update方法 update 方法用
  • Git 常用命令列表

    Git是一款免费 开源的分布式版本控制系统 xff0c 用于敏捷高效地处理任何或小或大的项目 xff0c 本文将介绍git常用的命令 1 回滚到上一版本 xff08 撤销本次所有操作 xff09 span class hljs commen
  • 编辑距离

    编辑距离 xff0c 又称Levenshtein距离 xff08 也叫做Edit Distance xff09 xff0c 是指两个字串之间 xff0c 由一个转成另一个所需的最少编辑操作次数 许可的编辑操作包括将一个字符替换成另一个字符
  • ubuntu下安装Apache+PHP+Mysql

    步骤一 xff0c 安装apache2 sudo apt get install apache2 安装完成 运行如下命令重启下 xff1a sudo etc init d apache2 restart 在浏览器里输入http localh
  • Redhat-ansible-合集

    1 安装 2 部署ANSIBLE 2 1INVENTORY 2 2ANSIBLE配置文件 2 3AD HOC命令 3 PLAYBOOK 4 变量 5 ansible vault加密变量 6 ansible facts 7 loop 8 条件
  • 如何在ubuntu上安装node.js

    Node js是一套用来编写高性能网络服务器的JavaScript工具包 xff0c 一系列的变化由此开始 比较独特的是 xff0c Node js会假设你是在POSIX环境下运行它 Linux 或 Mac OS X 如果你是在Window
  • 在ubuntu下安装memcache

    使用Memcache的网站一般流量都是比较大的 xff0c 为了缓解数据库的压力 xff0c 让Memcache作为一个缓存区域 xff0c 把部分信息保存在内存中 xff0c 在前端能 够迅速的进行存取 下面来介绍一下如何安装和使用mem
  • 尝试用Gearman实现分布式处理(PHP)

    本文需要你已对Gearman有个大致了解 顺便再推荐两篇参考文章 http hi baidu com thinkinginlamp blog item ff49972b9e7378f3e6cd40aa html xff08 学学Gearma
  • memcached的分布式算法–一致性hash

    memcached的分布式是什么意思 xff1f 下面假设memcached服务器有node1 xff5e node3三台 xff0c 应用程序要保存键名为 tokyo kanagawa chiba saitama gunma 的数据 首先
  • Linux crontab定时执行任务 命令格式与详细例子

    基本格式 command 分 时 日 月 周 命令 第1列表示分钟1 xff5e 59 每分钟用 或者 1表示 第2列表示小时1 xff5e 23 xff08 0表示0点 xff09 第3列表示日期1 xff5e 31 第4列表示月份1 x
  • php 利用反射API获取类信息

    PHP具有完整的反射API xff0c 可以对类 接口 函数 方法和扩展进行反向工程 反射API并提供方法取出函数 类和方法中的文档注释 本文将介绍使用PHP反射API获取类信息的方法 xff0c 提供完整演示代码 PHP反射API文档地址
  • mysql查询时,offset过大影响性能的原因与优化方法

    mysql查询使用select命令 配合limit offset参数可以读取指定范围的记录 本文将介绍mysql查询时 offset过大影响性能的原因及优化方法 准备测试数据表及数据 1 创建表 span class hljs operat
  • php中常见的header类型

    lt php 使用 mime content type 查看 mimetypes 61 array 39 ez 39 61 gt 39 application andrew inset 39 39 hqx 39 61 gt 39 appli
  • php Captcha 驗證碼類

    lt php Captcha 驗證碼類 Date 2011 02 19 Author fdipzone class Captcha class start private sname 61 39 39 public function con
  • HTML5本地存储不完全指南

    编辑推荐 xff1a 这篇文章来自于黑客志 xff0c 对HTML5的本次存储方式进行了非常全面的介绍和分析 xff0c 对于学习HTML5的开发者来说 xff0c 不容错过哦 历史 在HTML5本地存储之前 xff0c 如果我们想在客户端