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

上一节我们已经讲了Chrome扩展的基础知识,并构建了基础的html,这一节我们将就html DOM添加部分添加脚本,即脚本在我们的popup页面中进行的操作,页面所产生的变化。

正常情况下数据处理加载完成状态,这些数据是从本地数据读取的。

点击“添加新项”,出现输入框,输入文字后回车提交数据:

添加完成后将数据存储,同时添加DOM元素:

考虑到功能最简化处理,点击已标为完成的任务,将提示“删除或重置为未完成”:

以上功能为最核心功能,可以在此基础上进行扩展,比如任务分组,修改任务,任务提醒,网络同步数据等等。

下面开始相应的脚本内容。

为了避免全局变量,使用匿名函数方式,所有事件处理及数据绑定均在此函数中进行,同时定义与jQuery中的$()类似的函数:

(function(){
    var $=function(id){return document.getElementById(id);}
})();

建立Tasks对象,定义show()函数和hide()函数,同时存储几个常用的DOM对象。

var Tasks = {
  show:function(obj){
    obj.className='';
    return this;
  },
  hide:function(obj){
    obj.className='hide';
    return this;
  },
  //存储dom
  $addItemDiv:$('addItemDiv'),
  $addItemInput:$('addItemInput'),
  $txtTaskTitle:$('txtTaskTitle'),
  $taskItemList:$('taskItemList')
}

其中show()函数和hide()函数均使用了链式调用,每次执行此函数均会返回对象本身,这样对象就可以使用形如类似jQuery书写方式来使用此函数。

然后注册事件:

//.....
//初始化
init:function(){
    /*注册事件*/
    //打开添加文本框
    Tasks.$addItemDiv.addEventListener('click',function(){
        Tasks.show(Tasks.$addItemInput).hide(Tasks.$addItemDiv);
        Tasks.$txtTaskTitle.focus();
    },true);
    //回车添加
    Tasks.$txtTaskTitle.addEventListener('keyup',function(ev){
        var ev=ev || window.event;
        if(ev.keyCode==13){
            //TODO:写入本地数据
            Tasks.AppendHtml(task);
            Tasks.$txtTaskTitle.value='';
            Tasks.hide(Tasks.$addItemInput).show(Tasks.$addItemDiv);
        }
        ev.preventDefault();
    },true);
    //取消
    Tasks.$txtTaskTitle.addEventListener('blur',function(){
        Tasks.$txtTaskTitle.value='';
        Tasks.hide(Tasks.$addItemInput).show(Tasks.$addItemDiv);
    },true);
    //TODO:初始化数据,加载本地数据,生成html         
},
//....

其中待完成部分为我们下一节将重点计到的html5的本地存储功能。再定义数据操作部分,先写上空白函数:

//....
//增加
Add:function(){
    //TODO
},
//修改
Edit:function(){
    //TODO
},
//删除
Del:function(){
    //TODO
},
//...

还需要初始化此函数使其执行并让匿名函数执行:

(function(){
    var Tasks = {
//***
    }
    Tasks.init();
})();

好吧,以下就是本节中所要提到的全部代码:

(function(){
    var $=function(id){return document.getElementById(id);}
    var Tasks = {
        show:function(obj){
            obj.className='';
            return this;
        },
        hide:function(obj){
            obj.className='hide';
            return this;
        },
        //存储dom
        $addItemDiv:$('addItemDiv'),
        $addItemInput:$('addItemInput'),
        $txtTaskTitle:$('txtTaskTitle'),
        $taskItemList:$('taskItemList'),
        //初始化
        init:function(){
            /*注册事件*/
            //打开添加文本框
            Tasks.$addItemDiv.addEventListener('click',function(){
                Tasks.show(Tasks.$addItemInput).hide(Tasks.$addItemDiv);
                Tasks.$txtTaskTitle.focus();
            },true);
            //回车添加
            Tasks.$txtTaskTitle.addEventListener('keyup',function(ev){
                var ev=ev || window.event;
                if(ev.keyCode==13){
                    //TODO:写入本地数据
                    Tasks.AppendHtml(Tasks.$txtTaskTitle.value);
                    Tasks.$txtTaskTitle.value='';
                    Tasks.hide(Tasks.$addItemInput).show(Tasks.$addItemDiv);
                }
                ev.preventDefault();
            },true);
            //取消
            Tasks.$txtTaskTitle.addEventListener('blur',function(){
                Tasks.$txtTaskTitle.value='';
                Tasks.hide(Tasks.$addItemInput).show(Tasks.$addItemDiv);
            },true);
            //TODO:初始化数据,加载本地数据,生成html         
        },
        //增加
        Add:function(){
            //TODO
        },
        //修改
        Edit:function(){
            //TODO
        },
        //删除
        Del:function(){
            //TODO
        },
        AppendHtml:function(title){
            var oDiv=document.createElement('div');
            oDiv.className='taskItem';
            var oLabel=document.createElement('label');
            oLabel.className= 'on';
            var oSpan=document.createElement('span');
            oSpan.className='taskTitle';
            var oText=document.createTextNode(title);
            oSpan.appendChild(oText);
            oDiv.appendChild(oLabel);
            oDiv.appendChild(oSpan);
            //注册事件
            oDiv.addEventListener('click',function(){
                //TODO
            },true);
            Tasks.$taskItemList.appendChild(oDiv); 
        },
        RemoveHtml:function(){
            //TODO
        }
    }
    Tasks.init();
})();

代码中尚未实现的部分,我们将会在下节详细讲解其实现。

手把手教你开发Chrome扩展二:为html添加行为的更多相关文章

  1. 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单   手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩 ...

  2. 手把手教你开发chrome扩展

    转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html 手把手教你开发chrome扩展一:开发Chrome Extenst ...

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

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

  4. 开发 chrome 扩展 GitHub-Remarks 的一些想法以及遗憾

    前文 对于单页应用中如何监听 URL 变化的思考 说到我在开发 chrome 扩展 GitHub Remarks 中遇到的一个问题,本文来聊聊开发这个扩展的前后心路历程. 为什么开发这个扩展?前文说到 ...

  5. 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚

    新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...

  6. 手把手教你使用Vuex(二)

    在上一篇文章Vuex(一)中我们已经把Vuex需要用到的属性的单独页面引入到了store/index.js里面,所以我们接下来直接在这些js文件中写自己需要的代码就好. 1.Getter 了解:Get ...

  7. 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

  8. ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

  9. 手把手教你开发BLE数据透传应用程序

    如何开发BLE数据透传应用程序?什么是BLE service和characteristic?如何开发自己的service和characteristic?如何区分ATT和GATT?有没有什么工具可以对B ...

随机推荐

  1. 阿里云服务器安装ss使用

    下载安装服务器版shadowsocks yum install epel-release yum update yum install python-setuptools m2crypto super ...

  2. 镜像中的 Everything, GnomeLive ,KdeLive ,livecd ,NetInstall的区别?

    everything: 对完整版安装盘的软件进行补充,集成所有软件 GnomeLive , GNOME桌面版 KdeLive , KDE桌面版 livecd 光盘上运行的系统 ,NetInstall ...

  3. AndroidStudio启动App时,数据取不到。

    最近在用AndroidStudio开发App的时候,所连的服务器如果是换成本机上的,那么启动App的时候数据就读取不出来,连其它电脑上的服务器就是正常的,如下: 05-11 09:36:57.178 ...

  4. JAVA——不简单的fianl关键字

    protected用来修饰 域,代表域的访问权限是:包权限 或者 不同包,但是是子类 : final 修饰常量只要是该常量代入的计算式,在编译时期,就会被执行计算,以减轻运行时的负担.(只对基本数据类 ...

  5. python练习1 登录和三级菜单

    ,: username1 = input("请输入您的用户名:")# password1 = getpass.getpass("请输入您的密码:") passw ...

  6. Java之Servlet文件下载20190228

    jsp页面: <%@ page language="java" contentType="text/html; charset=utf-8" pageEn ...

  7. RabbitMQ 基础概念介绍

    AMQP 消息模型 RabbitMQ 是基于 AMQP(高级消息队列协议)的一个开源实现,其内部实际也是 AMQP 的基本概念.

  8. 面试之Redis

    面:缓存中间件--Memcached和Redis的区别是什么? 答:Memcached的优点是简单易用,代码层次类似与Hash.支持简单数据类型,但不支持数据持久化存储,也不支持主从同步,也不支持分片 ...

  9. Spring Cloud和Dubbo的对比

  10. php更改wampserver的站点目录

    我都wampserver安装在f盘 F:\wamp\bin\apache\Apache2.4.4\conf文件夹下的hhtpd.conf文件ctrl+f查找DocumentRoot,第二次的位置修改即 ...