转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html

HTML5中的localStorage

localStorage与cookie类似,它是存储在客户端浏览器中的数据,它与cookie不同的一点是它没有时间限制。localStorage属于html5中的新特性,在浏览器支持localStorage统计中,Chrome4+、Firefox3.5+、IE8+、IE7兼容模式、Safari4+、Opera10.5+都是支持localStorage的。以下代码可以用于检测你的浏览器是否支持localStorage:

if(window.localStorage){
    alert('你的浏览器支持localStorage!');
}else{
    alert('浏览器不支持localStorage!');
}

localStorage是以key/value方式来进行存储的,并且value只能是字符串形式,如果你要使用其他数据类型,需要进行相应的转换。设置和获取localStorage方法是使用localStorage.key,或localStorage[key]的形式,如:

localStorage.myName='walkingp';
localStorage['mySite']='http://www.cnblogs.com/walkingp';
alert('name:' + localStorage.myName + '\rsite:' + localStorage['mySite']);

修改其值就是重新设置相应的localStorage项取值。移除其值可以将其值设为null。

localStorage['mySite']=null;

也可以使用localStorage自带方法getItem()、setItem()和removeItem()来进行相应的获取、设置和移除localStorage项。

localStorage.setItem('age','24');
var age=localStorage.getItem('age');
alert('age:' + age);//age:24
localStorage.removeItem('age');
age=localStorage.getItem('age');
alert('age? ' + age);//age? null

可以使用clear()方法来清空所有localStorage。

对于不同域的localStorage,如本地和a.com,两者不影响对方。

关于localStorage本地存储大小,有人测试结果是其他浏览器为5M,Firefox没有作限制。而cookie一般只有几K,可见localStorage非常适合做稍大一些的数据存储,当然对于Chrome等扩展开发是非常合适的。

浏览器中的localStorage管理工具

Chrome和Safari均有自己的本地localStorage查看和管理工具,Firefox拥有第三方插件可以管理 localStorage,Chrome中位于开发人员工具中的Resources左侧的Databases(可能稍早一点的版本位于单独出来的工具 栏)。我们上面的localStorage在Chrome查看如下,利用这个工具可以修改或者删除相应项。

Safari中需要先在“偏好设置”、“高级”中将“在菜单中显示开发选项”勾选。

开始存储我们的localStorage

以上是我们需要了解的关于localStorage的知识,接下来就是把这个知识应用到我们Chrome扩展中。我们的数据存储分为两个部分,一是每项task需要存储的内容,它是以JSON的形式来存储的,形式如下:

task1:{"id":1,"task_item":"新任务","add_time":"2011-04-04T03:20:34.879Z","is_finished":false}

task1表示key项,后台的JSON表示value项。意义很简单明了,其中is_finished表示当前任务是否已完成。当更新任务状态时就是将此项取值进行相应的更改。

还要放一个指向当前任务的数据,让它充当指针的作用,这样在添加新项时就不需要查询已有task项的id了。

'Tasks:index':1

下面是我们代码的具体实现,首先开始初始化数据:

var Tasks = {
    //指针
    index:window.localStorage.getItem('Tasks:index'),
    //初始化
    init:function(){
        if(!Tasks.index){
            window.localStorage.setItem('Tasks:index',Tasks.index=0);
        }
        //初始化数据
        if(window.localStorage.length-1){
            var task_list=[];
            var key;
            for(var i=0,len=window.localStorage.length;i<len;i++){
                key=window.localStorage.key(i);
                if(/task:\d+/.test(key)){
                    task_list.push(JSON.parse(window.localStorage.getItem(key)));
                }
            }
            for(var i=0,len=task_list.length;i<len;i++){
                Tasks.AppendHtml(task_list[i]);
            }
        }
    },
//***
}

然后是分别是增加项Add()、修改项Edit()和删除项Del()的方法:

//增加
Add:function(task){
    //更新指针
    window.localStorage.setItem('Tasks:index', ++Tasks.index);
    task.id=Tasks.index;
    window.localStorage.setItem("task:"+ Tasks.index, JSON.stringify(task));
},
//修改
Edit:function(task){
    window.localStorage.setItem("task:"+ task.id, JSON.stringify(task));
},
//删除
Del:function(task){
    window.localStorage.removeItem("task:"+ task.id);
},
//***

其中的JSON.stringify是JSON将Javascript数据结构转换为JSON文本的方法,它与eval()为互操作。详情可见http://json.org/js.html 。

这样我们就将一个简单的Chrome扩展完成了,演示效果图如下:


当然它现在的功能还不够强大,我们还可以对它进行继续扩展,比如任务排序、任务分组、网络存储、定时提醒等。

系列文章至此暂时结束,全部代码包括生成后.crx文件已经打包,下载请点击此处。可能已有代码有一些处理不完善的地方,欢迎大家一一指出,共同进步!

黄聪:360浏览器、chrome开发扩展插件教程(3)关于本地存储数据的更多相关文章

  1. 黄聪:360浏览器、chrome开发扩展插件教程(1)开发Chrome Extenstion其实很简单

    转载:http://www.cnblogs.com/walkingp/archive/2011/03/31/2001628.html Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是 ...

  2. 黄聪:360浏览器、chrome开发扩展插件教程(2)为html添加行为

    转载:http://www.cnblogs.com/walkingp/archive/2011/04/02/2002668.html 上一节我们已经讲了Chrome扩展的基础知识,并构建了基础的htm ...

  3. 黄聪:将自己开发的插件发布到WordPress官方插件站(转)

    原文作者:我爱水煮鱼 把你的插件发布到 WordPress 官方插件目录是让更多人用到插件的好方法,这样可以让你的插件不仅仅给我们中国人民使用,而且还可以让你的插件给全世界人民使用,想想全世界人民都在 ...

  4. Chrome浏览器录屏扩展插件

    Chrome浏览器录屏扩展插件,可以录制网页操作或者桌面操作.生成MP4 Loom https://chrome.google.com/webstore/detail/loom-video-recor ...

  5. 手把手教你开发Chrome扩展三:关于本地存储数据

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...

  6. 黄聪:《跟黄聪学WordPress主题开发》

    又一个作品完成!<跟黄聪学Wordpress主题开发>,国内最好的Wordpress主题模版开发视频教程!! 目录预览: WordPress官方源文件层式结构讲解 WordPress数据库 ...

  7. 提高工作效率的神器:基于前端表格实现Chrome Excel扩展插件

    Chrome插件,官方名称extensions(扩展程序):为了方便理解,以下都称为插件. 我们开发的插件需要在浏览器里面运行,打开浏览器,通过右上角的三个点(自定义及控制)-更多工具-拓展程序-打开 ...

  8. 开发DZ插件教程

    插件制作的基本思路是:(初学者适用)1.形成插件思路2.制作插件界面3.构架程序模块4.搭建存储数据5.填充功能语句6.检查应用错误7.完善插件功能 前言:为方便互联网数万Discuz!爱好者,更加深 ...

  9. 黄聪:360、chrome开发插件扩展如何跨域调用其他网站的信息并且显示在扩展、tab中的api

    chrome插件提供了查找tab的api chrome.tabs.get(integer tabId, function callback) 但是出于安全的考虑,tab的属性中没有document 因 ...

随机推荐

  1. 【转】为什么我的DIV块前总有空隙?

    在做网站项目时,博主爱吾所爱(爱生活=爱技术)很偶然地碰到一个奇怪的事情.我的DIV嵌套在另一个DIV里,总是出现这样一行空隙: Firebug查看内外两层DIV的margin, padding, l ...

  2. Duilib应用修改程序图标方法

    本文向大家介绍如何修改duilib应用图标,对于win32或者mfc应用来说,我们可以在注册窗口类时指定WNDCLASS结构体的HIcon属性.那么duilib应用该怎样处理呢?大家都知道Window ...

  3. 设置VS快捷代码片段

    一.自定义sinppets方式 1.在VS安装路径[D:\vs2013\VC\Snippets\2052\Visual C++]下新建一个snippt文件 2.添加代码 <?xml versio ...

  4. git clone时,提示warning: remote HEAD refers to nonexistent ref, unable to checkout

    一.环境 发行版:Ubuntu 18.04.1 LTS 代号:bionic 内核版本:4.15.0-30-generic 二.背景 git clone https://source.codeauror ...

  5. [参考]用递归的方法获取 字符 对应的 二进制字符串 (C/C++)

    将字符转换为16进制字符串.十进制字符串可以参考这里:https://www.cnblogs.com/stxs/p/8846545.html 代码及调试结果 举例:字符'a',查ASCII码表它对应的 ...

  6. Execution Order for the ApiController

    Execution Order for the ApiController Assuming the request goes into the ApiController scope, the op ...

  7. Python学习札记(三十八) 面向对象编程 Object Oriented Program 9

    参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ...

  8. UOJ #122 【NOI2013】 树的计数

    题目链接:树的计数 这道题好神啊……正好有人讲了这道题,那么我就写掉吧…… 首先,为了方便考虑,我们可以把节点重标号,使得\(bfs\)序变成\(1,2,3,\dots,n\),那么显然树的深度就是\ ...

  9. vim 安装vim-airline

    在.vimrc中添加 Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' 然后打开vim编辑器执行 :Pl ...

  10. SSH防止暴力破解--fail2ban

    一.ssh密钥对无交互登录 实战1:通过密钥进行sshd服务认证 服务端:linl_S    IP:10.0.0.15 客户端:lin_C    IP:10.0.0.16   1)在客户端生成密钥对 ...