黃聰:360瀏覽器、chrome開發擴展插件教程(2)為html添加行為


轉載:http://www.cnblogs.com/walkingp/archive/2011/04/02/2002668.html

上一節我們已經講了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();
})();

代碼中尚未實現的部分,我們將會在下節詳細講解其實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM