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本地存储不完全指南 的相关文章

  • JSP通用分页

    通用分页核心思路 将上一次查询请求再发一次 只不过页码变了 实现步骤 1 先查询全部数据 baseDao
  • 在react中如何结合antd实现分页功能

    在react中如何结合antd实现分页功能 步骤如下 1安装antd npm i antd s 2在 src App css中引入 antd dist antd css import antd dist antd css 3在需要用分页器的
  • 移动端页面禁止放大缩小

    安卓 在index html文件中添加meta标签 IOS 在 src app vue 中 script 标签内添加代码
  • EduCoder_web实训作业--JavaScript学习手册七:JS循环语句

    第一关 Begin var sum 0 var i 2 while i lt a var j 2 while j lt i if i j 0 能被整除 不是质数 break 不需要再判断 j 除数加1 继续测试是不是质数 if j i 还是
  • 微信H5如何关闭浏览器(如何监听手机的物理返回键)

    一 背景 背景是这样的 该项目进入h5时会通过 location replace xxx 或 location href xxx 跳转到某个地址 该地址会请求获得微信 openId 获取成功后再重定向到h5首页 那么问题来了 重定向会在微信
  • 前端学习——JavaScript原生实现购物车案例

    一 购物车案例 1 1 案例介绍 今天我们来写另外一个购物车案例 说实话对于我来说这个是花了将近三个小时的时间然后才做出来的 里面可能还存在一些我没有发现的问题 但是能完成基本的功能 对于一些基本的需求都是可以完成的 下面照旧是案例实现的g
  • ADS2020.2安装

    双击安装包中的 exe文件 开始安装 安装结束后 直接点击退出 然后将crack文件夹中的两个文件夹 分别复制到刚刚的安装路径下 分别替换12个和2个同名文件 注意 这两个文件夹的名字要和刚刚安装的文件夹的名字一致 就是将Crack文件夹中
  • 掘金个人主页头像旋转效果

    img src https sf1 ttcdn tos pstatp com img user avatar d1d3c1b115358ea70f51edcd697b58b2 300x300 image alt 钱端挖掘机师傅的个人资料头像
  • JavaScript基础Day02:流程控制

    文章目录 1 顺序结构 2 分支结构 1 if语句 2 switch语句 3 循环结构 1 while语句 2 do while语句 3 for循环 1 顺序结构 2 分支结构 1 if语句 if 条件表达式 执行语句 if 条件表达式 成
  • html文本元素

    文章目录 h p span pre code 实体字符 strong i em del s h h head 标题 一共有六级标题 hKaTeX parse error Expected got EOF at end of input 6
  • HTML 5 标签、属性、事件及浏览器兼容性速查表

    HTML 5 可以说是近十年来 Web 标准最巨大的飞跃 和以前的版本不同 HTML 5 并非仅仅用来表示 Web 内容 它的使命是将 Web 带入一个成熟的应用平台 在这个平台上 视频 音频 图象 动画 以及同电脑的交互都被标准化 尽管
  • 微信小程序:图片高度设置无效问题

    控制台查看元素 显示其style中多了一个没有设置的高度值 找了很久发现是因为image标签设置了mode widthFix 此时高度会自适应 样式中设置高度无效
  • flex布局详解

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 flex基本概念 任何一个容器都可以指定为Flex布局 例如 box displa
  • 移动端适配-01-百分比宽度

    1 图片可以在parent中使用 1 line heigh和text align使水平和竖直居中 2 在img标签中加vertical align middle 2 3 background size 1 两个参数 background s
  • webpack5 配置&使用 文档(大全)

    一 起步 1 基本安装 首先我们创建一个目录 初始化 npm 然后 在本地安装 webpack 接着安装 webpack cli 此工具用于在命令行中运行 webpack mkdir webpack demo cd webpack demo
  • 【HTML】HTML5的拖放你用了吗

    HTML HTML5的拖放你用了吗 引言 github HTML HTML5的拖放你用了吗 内容速递 看了本文您能了解到的知识 在 HTML5 中 拖放是标准的一部分 任何元素都能够拖放 拖放的操作 多用在拖拽排序列表 游戏拼图等 下文中出
  • HTML5学习(三):布局标签、列表、超链接和id

    1 布局标签 header表示网页的头部 页眉 main表示网页的主体部分 一个页面中只会有一个main footer表示网页的底部 页脚 nav表示网页中的导航 aside和主体相关的其他内容 侧边栏 article表示一个独立的文章 s
  • html创建添加地图(超简单)

    1 打开百度地图创建平台 百度地图创建平台 2 根据个人需求改就行了 可加标注 3 点击获取代码 复制下来就可以用了 4 个人用的是HBulider 复制到里面可直接用了 如果有文字显示问题 把编码改成utf 8就行了 5 地图控件位置在网
  • 测试基础知识

    常见测试分类 按测试阶段划分 单元测试 针对程序源码进行测试 国内是开发自测 集成测试 又称接口测试 针对模块间的访问地址进行测试 系统测试 对整个系统进行测试 包括功能 兼容性 文档等 验收测试 分为内测和公测 按代码可见度划分 黑盒测试
  • 使用企业订货软件的担忧与考虑|网上APP订货系统

    使用企业订货软件的担忧与考虑 网上APP订货系统 网上订货系统担心出现的问题 1 如果在订货系统中定错 多 货物了该怎么办 其实这也是很多人在网购或者是现实中经常会犯的一个错误 但是网上订货平台为大家提供了很多的解决方案 其中对于订单的修改

随机推荐

  • 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 如果我们想在客户端