亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript插件化開發教程(六)

2019-11-20 13:15:59
字體:
來源:轉載
供稿:網友

一,開篇分析

今天這篇文章我們說點什么那?嘿嘿嘿。我們接著上篇文章對不足的地方進行重構,以深入淺出的方式來逐步分析,讓大家有一個循序漸進提高的過程。廢話少說,進入正題。讓我們先來回顧一下之前的

Js部分的代碼,如下:

復制代碼 代碼如下:

 function ItemSelector(elem,opts){
     this.elem = elem ;
     this.opts = opts ;
 } ;
 var ISProto = ItemSelector.prototype ;
 ISProto.getElem = function(){
     return this.elem ;
 } ;
 ISProto.getOpts = function(){
     return this.opts ;
 } ;
 /* data manip*/
 ISProto._setCurrent = function(current){
     this.getOpts()["current"] = current ;
 } ;
 ISProto.getCurrentValue = function(current){
     return this.getOpts()["current"] ;
 } ;
 /* data manip*/
 ISProto.init = function(){
     var that = this ;
     this.getOpts()["current"] = null ; // 數據游標
     this._setItemValue(this.getOpts()["currentText"]) ;
     var itemsElem = that.getElem().find(".content .items") ;
     this.getElem().find(".title div").on("click",function(){
         itemsElem.toggle() ;
     }) ;
     this.getElem().find(".title span").on("click",function(){
         itemsElem.toggle() ;
     }) ;
     $.each(this.getOpts()["items"],function(i,item){
         item["id"] = (new Date().getTime()).toString() ;
         that._render(item) ;
     }) ;
 } ;
 ISProto._setItemValue = function(value){
     this.getElem().find(".title div").text(value)
 } ;
 ISProto._render = function(item){
     var that = this ;
     var itemElem = $("<div></div>")
     .text(item["text"])
     .attr("id",item["id"]) ;
     if("0" == item["disabled"]){
         itemElem.on("click",function(){
             var onChange = that.getOpts()["change"] ;
             that.getElem().find(".content .items").hide() ;
             that._setItemValue(item["text"]) ;
             that._setCurrent(item) ;
             onChange && onChange(item) ;
         })
         .mouseover(function(){
             $(this).addClass("item-hover") ;
         })
         .mouseout(function(){
             $(this).removeClass("item-hover") ;
         }) ;
     }
     else{
         itemElem.css("color","#ccc").on("click",function(){
             that.getElem().find(".content .items").hide() ;
             that._setItemValue(item["text"]) ;
         }) ;
     }
     itemElem.appendTo(this.getElem().find(".content .items")) ;
 } ;

  效果如下圖所示:

  a)------非可操作狀態

  b)------可操作狀態

(二),打開思路,進行重構

  大家從代碼不難看出,已經通過“Js”中的語法特性,以面向對象的方式進行了有效的組織,比松散的過程化形式的組織方式好多了,但是仍然會發現有很多不足的地方。

 ?。?),里面重復代碼太多

 ?。?),職責劃分不清晰

  (3),流程梳理不健全

  我們基于以上幾點進行有效的重構,我們首先要梳理一下這個組件的需求,功能點如下:

 ?。?),初始化配置組件

復制代碼 代碼如下:

 $(function(){
     var itemSelector = new ItemSelector($("#item-selector"),{
         currentText : "Please Choose Item" ,
         items : [
             {
                 text : "JavaScript" ,
                 value : "js" ,
                 disabled : "1"
             } ,
             {
                 text : "Css" ,
                 value : "css" ,
                 disabled : "0"
             } ,
             {
                 text : "Html" ,
                 value : "html" ,
                 disabled : "0"
             }
         ] ,
     }) ;
     itemSelector.init() ;
 }) ;

  這塊代碼很清晰,不需要做任何修改,但是大家可以基于以上配置擴展功能,比如增加配置項“mode”支持多種選項方式。如:“checkbox勾選模式”。

  接下來是要完成初始化邏輯,如下:

復制代碼 代碼如下:

 ISProto.init = function(){
     var that = this ;
     this.getOpts()["current"] = null ; // 數據游標
     this._setItemValue(this.getOpts()["currentText"]) ;
     var itemsElem = that.getElem().find(".content .items") ;
     this.getElem().find(".title div").on("click",function(){
         itemsElem.toggle() ;
     }) ;
     this.getElem().find(".title span").on("click",function(){
         itemsElem.toggle() ;
     }) ;
     $.each(this.getOpts()["items"],function(i,item){
         item["id"] = (new Date().getTime()).toString() ;
         that._render(item) ;
     }) ;
 } ;

  這段代碼問題很多,職責不明確,初始化邏輯包含了功能點的細節實現。

  再繼續看渲染部分代碼:

復制代碼 代碼如下:

 ISProto._render = function(item){
     var that = this ;
     var itemElem = $("<div></div>")
     .text(item["text"])
     .attr("id",item["id"]) ;
     if("0" == item["disabled"]){
         itemElem.on("click",function(){
             var onChange = that.getOpts()["change"] ;
             that.getElem().find(".content .items").hide() ;
             that._setItemValue(item["text"]) ;
             that._setCurrent(item) ;
             onChange && onChange(item) ;
         })
         .mouseover(function(){
             $(this).addClass("item-hover") ;
         })
         .mouseout(function(){
             $(this).removeClass("item-hover") ;
         }) ;
     }
     else{
         itemElem.css("color","#ccc").on("click",function(){
             that.getElem().find(".content .items").hide() ;
             that._setItemValue(item["text"]) ;
         }) ;
     }
     itemElem.appendTo(this.getElem().find(".content .items")) ;
 } ;

  問題很明顯,發現了重復性的操作,應該進行合理的抽象,已達到復用的目的。

  整個組建的流程包括初始化,渲染(事件綁定),還有就是相關的數據操作方法以及dom操作的輔助方法。

  綜上所述,經過簡單的梳理后,我們應該建立起功能的操作目的以及流程主線的任務分配,各負其責。

  所以我們重構的目的很明確了,對!就是進行功能點的抽象,友好的職責劃分,那么我們如何實現那?

  第一步,建立流程功能方法:(方法接口)

復制代碼 代碼如下:

ISProto.init = function(){
   // put you code here !
} ;
ISProto._render = function(){
   // put you code here !
} ;

 第二部,建立抽象后的方法接口:

復制代碼 代碼如下:

ISProto._fnItemSelectorDelegateHandler = function(){
   // put you code here !
} ;
ISProto._fnTriggerHandler = function(){
   // put you code here !
} ;
ISProto._addOrRemoveClass = function(){
   // put you code here !
} ;

第三步,建立數據操作接口:

復制代碼 代碼如下:

 ISProto._setCurrent = function(){
    // put you code here !
 } ;
 ISProto._getCurrent = function(){
    // put you code here !
 } ;

  還有一些參照下面的完整源碼,這里只是說的思路。

(三),完整代碼以供學習,本代碼已經過測試

復制代碼 代碼如下:

function ItemSelector(elem,opts){
    this.elem = elem ;
    this.opts = opts ;
    this.current = -1 ; // 數據游標
} ;
var ISProto = ItemSelector.prototype ;
/* getter api*/
ISProto.getElem = function(){
    return this.elem ;
} ;
ISProto.getOpts = function(){
    return this.opts ;
} ;
ISProto._getCurrent = function(){
    return this.current ;
} ;
/* getter api*/
/* data manip*/
ISProto._setCurrent = function(current){
    this.current = current ;
} ;
ISProto._setItemText = function(text){
    this.getElem().find(".title div").text(text) ;
} ;
/* data manip*/
 
/* update on 2015 1/31 23:38 */
ISProto._fnTriggerHandler = function(index,text,value){
    if(this._isDisabled(value)){
        index = -1 ;
        text = this.getOpts()["currentText"] ;
    }
    this._setItemText(text) ;
    this._setCurrent(index) ;
    this.getElem().find(".content .items").hide() ;
} ;
ISProto._addOrRemoveClass = function(elem,className,addIs){
    if(addIs){
        elem.addClass(className) ;
    }
    else{
        elem.removeClass(className) ;
    }
} ;
ISProto._fnItemSelectorDelegateHandler = function(){
    var that = this ;
    this.getElem().on("click","[data-toggle]",function(){
        that.getElem().find(".content .items").toggle() ;
    }) ;
} ;
ISProto._isDisabled = function(value){
    return ("1" == value) ? true : false ;
} ;
/* update on 2015 1/31 23:38 */
ISProto.init = function(){
    var that = this ;
    this._fnItemSelectorDelegateHandler() ;
    $.each(this.getOpts()["items"],function(i,item){
        item["index"] = i ;
        that._render(item) ;
    }) ;
    this._fnTriggerHandler(this._getCurrent(),this.getOpts()["currentText"],"1") ;
} ;
ISProto._render = function(item){
    var that = this ;
    var itemElem = $("<div></div>").text(item["text"]).attr("id",item["index"]) ;
    var activeClass = ("0" == item["disabled"]) ? "item-hover" : "item-disabled-hover" ;
    itemElem.on("click",function(){
        that._fnTriggerHandler(item["index"],item["text"],item["disabled"]) ;
    })
    .mouseover(function(){
        that._addOrRemoveClass($(this),activeClass,true) ;
    })
    .mouseout(function(){
        that._addOrRemoveClass($(this),activeClass,false) ;
    }) ;
    itemElem.appendTo(this.getElem().find(".content .items")) ;
} ;
  

(四),最后總結

 ?。?),面向對象的思考方式合理分析功能需求。

 ?。?),以類的方式來組織我們的插件邏輯。

 ?。?),不斷重構上面的實例,如何進行合理的重構那?不要設計過度,要游刃有余,推薦的方式是過程化設計與面向對象思想設計相結合。

    (4),下篇文章中會擴展相關功能,比如“mode”這個屬性,為"1"時支持checkbox多選模式,現在只是默認下拉模式。

看我本文,是不是要比上一篇代碼優秀了很多呢,小伙伴們自己做項目也應該多想多做,盡量使自己的代碼更加的合理。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品成人久久久| 蜜臀久久99精品久久久无需会员| 超碰日本道色综合久久综合| 日韩亚洲欧美中文高清在线| 日产日韩在线亚洲欧美| 91久久夜色精品国产网站| 色爱av美腿丝袜综合粉嫩av| 久久久免费av| 欧美人在线观看| 久久精品国产欧美激情| 97久久久免费福利网址| 7777精品视频| 日韩欧美在线第一页| 亚洲毛片一区二区| 国产性猛交xxxx免费看久久| 蜜月aⅴ免费一区二区三区| 国产亚洲激情视频在线| 日韩有码在线观看| 成人免费黄色网| 国内精品一区二区三区四区| 久久av红桃一区二区小说| 成人免费视频在线观看超级碰| 欧美最顶级的aⅴ艳星| 这里只有精品视频在线| 欧美小视频在线观看| 成人午夜在线观看| 国产视频亚洲精品| 久久在线精品视频| 久久久亚洲影院你懂的| 俺去啦;欧美日韩| 国产高清在线不卡| 欧美激情免费看| 亚洲国产精品久久91精品| 国产午夜精品一区理论片飘花| 国产精品xxx视频| 日产精品99久久久久久| 这里只有精品在线观看| 北条麻妃在线一区二区| 色久欧美在线视频观看| 国产精品直播网红| 2020久久国产精品| 国产精品高清网站| 久久久久久国产精品| 91综合免费在线| 国产主播精品在线| 欧美床上激情在线观看| 成人综合网网址| 久久综合伊人77777| 国产精品美女免费视频| 久久99精品视频一区97| 久久精品中文字幕电影| 在线精品视频视频中文字幕| 日韩中文字幕免费视频| 色综合伊人色综合网站| 久久久久久久成人| 日韩中文字在线| 欧美成人免费小视频| 亚洲a成v人在线观看| 亚洲一区二区三区xxx视频| 亚洲精品电影在线观看| 神马久久桃色视频| 午夜精品久久17c| 色噜噜国产精品视频一区二区| 亚洲黄色成人网| 欧美性生交xxxxxdddd| 国产suv精品一区二区| 国产午夜精品一区理论片飘花| 不用播放器成人网| 91美女片黄在线观看游戏| 欧美精品第一页在线播放| 欧美最猛黑人xxxx黑人猛叫黄| 欧美精品福利在线| 日韩欧美亚洲范冰冰与中字| 国产精品久久久久秋霞鲁丝| 日本一区二区在线播放| 欧美成人久久久| 日韩欧美在线中文字幕| 国产一区二区三区高清在线观看| 成人欧美一区二区三区黑人| 国产成人在线一区| 日韩av免费看网站| 久久久久久九九九| 亚洲国产精品电影在线观看| 欧美日韩午夜剧场| 亚洲色图狂野欧美| 国产欧美日韩中文| 国产精国产精品| 亚洲激情在线观看视频免费| 久久久爽爽爽美女图片| 色综合伊人色综合网站| 岛国视频午夜一区免费在线观看| 成人女保姆的销魂服务| 欧美成人亚洲成人| 国产xxx69麻豆国语对白| 国产精品视频免费在线观看| 日韩av中文字幕在线播放| 日韩欧美a级成人黄色| 欧美成人久久久| 国外成人在线直播| 日韩av手机在线看| 久久久久久欧美| www高清在线视频日韩欧美| 国产成人精品久久亚洲高清不卡| 精品国产乱码久久久久久天美| 国产日韩精品入口| 成人av番号网| 国产精品久久久久秋霞鲁丝| 精品国产一区二区三区久久久狼| 国产精品视频一区国模私拍| 在线国产精品视频| 按摩亚洲人久久| 国产精品亚洲网站| 亚洲精品一区中文字幕乱码| 91精品国产色综合久久不卡98| 97人人做人人爱| www.精品av.com| 久久久国产精彩视频美女艺术照福利| 国产综合福利在线| 久久久精品在线观看| 亚洲精品suv精品一区二区| 欧美一级淫片丝袜脚交| 伊人伊成久久人综合网站| 精品人伦一区二区三区蜜桃免费| 精品久久久久国产| 在线成人中文字幕| 亚洲伊人一本大道中文字幕| 中文字幕亚洲欧美日韩2019| 国产精品极品美女粉嫩高清在线| 亚洲午夜色婷婷在线| 一色桃子一区二区| 国产精品美女www爽爽爽视频| 中文字幕精品av| 日韩中文字幕网| 欧美裸身视频免费观看| 精品自拍视频在线观看| 久久福利视频网| 亚洲字幕一区二区| 亚洲乱码国产乱码精品精天堂| 欧美性极品xxxx娇小| 亚洲性无码av在线| 最新亚洲国产精品| 国产成人涩涩涩视频在线观看| 欧美亚洲国产成人精品| 久久久久久久影视| 国产精品福利观看| 欧美大片在线看免费观看| 欧美日韩加勒比精品一区| 欧美精品国产精品日韩精品| 91黑丝在线观看| 91精品久久久久久久久中文字幕| 国产成人自拍视频在线观看| 91在线视频精品| 国产精品一区二区三区成人| 精品国产31久久久久久| 久久中文字幕视频| 国产在线a不卡| 伊人亚洲福利一区二区三区| 久久视频在线直播| 国产精品mp4| 日韩一级黄色av| 国产视频亚洲视频| 成人h片在线播放免费网站| 国产精品尤物福利片在线观看| 久久久久久国产精品美女|