中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      JavaScript插件化開發(fā)方式

      時間:2024-10-08 16:33:11 JavaScript 我要投稿
      • 相關(guān)推薦

      JavaScript插件化開發(fā)方式

        一,開篇分析

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

        Js部分的代碼,如下:

        復(fù)制代碼 代碼如下:

        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 ; // 數(shù)據(jù)游標

        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 = $("

      ")

        .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)------非可操作狀態(tài)

        b)------可操作狀態(tài)

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

        大家從代碼不難看出,已經(jīng)通過“Js”中的語法特性,以面向?qū)ο蟮姆绞竭M行了有效的組織,比松散的過程化形式的組織方式好多了,但是仍然會發(fā)現(xiàn)有很多不足的地方。

        (1),里面重復(fù)代碼太多

        (2),職責劃分不清晰

        (3),流程梳理不健全

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

        (1),初始化配置組件

        復(fù)制代碼 代碼如下:

        $(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勾選模式”。

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

        復(fù)制代碼 代碼如下:

        ISProto.init = function(){

        var that = this ;

        this.getOpts()["current"] = null ; // 數(shù)據(jù)游標

        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) ;

        }) ;

        } ;

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

        再繼續(xù)看渲染部分代碼:

        復(fù)制代碼 代碼如下:

        ISProto._render = function(item){

        var that = this ;

        var itemElem = $("

      ")

        .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")) ;

        } ;

        問題很明顯,發(fā)現(xiàn)了重復(fù)性的操作,應(yīng)該進行合理的抽象,已達到復(fù)用的目的。

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

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

        所以我們重構(gòu)的目的很明確了,對!就是進行功能點的抽象,友好的職責劃分,那么我們?nèi)绾螌崿F(xiàn)那?

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

        復(fù)制代碼 代碼如下:

        ISProto.init = function(){

        // put you code here !

        } ;

        ISProto._render = function(){

        // put you code here !

        } ;

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

        復(fù)制代碼 代碼如下:

        ISProto._fnItemSelectorDelegateHandler = function(){

        // put you code here !

        } ;

        ISProto._fnTriggerHandler = function(){

        // put you code here !

        } ;

        ISProto._addOrRemoveClass = function(){

        // put you code here !

        } ;

        第三步,建立數(shù)據(jù)操作接口:

        復(fù)制代碼 代碼如下:

        ISProto._setCurrent = function(){

        // put you code here !

        } ;

        ISProto._getCurrent = function(){

        // put you code here !

        } ;

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

        (三),完整代碼以供學(xué)習(xí),本代碼已經(jīng)過測試

        復(fù)制代碼 代碼如下:

        function ItemSelector(elem,opts){

        this.elem = elem ;

        this.opts = opts ;

        this.current = -1 ; // 數(shù)據(jù)游標

        } ;

        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*/

        /* 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 ;

        } ;

        /* 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 = $("

      ").text(item["text"]).attr("id",item["index"]) ;

        var activeClass = ("0" == item["disabled"]) " : "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")) ;

        } ;

        (四),最后總結(jié)

        (1),面向?qū)ο蟮乃伎挤绞胶侠矸治龉δ苄枨蟆?/p>

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

        (3),不斷重構(gòu)上面的實例,如何進行合理的重構(gòu)那?不要設(shè)計過度,要游刃有余,推薦的方式是過程化設(shè)計與面向?qū)ο笏枷朐O(shè)計相結(jié)合。

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

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

      【JavaScript插件化開發(fā)方式】相關(guān)文章:

      JavaScript日期時間格式化函數(shù)08-29

      對javascript的理解08-08

      常用的JavaScript模式09-22

      Javascript的this用法簡述08-15

      JavaScript學(xué)習(xí)筆記08-24

      JavaScript 基礎(chǔ)教學(xué)09-29

      JavaScript的課堂講解09-03

      AE影視常用插件FORM的應(yīng)用技巧09-03

      JavaScript常用方法匯總10-25

      JavaScript數(shù)組常用方法介紹09-04

      主站蜘蛛池模板: 久久精品国产只有精品96| 午夜福利不卡无码视频| 大新县| 美女精品黄色淫秽片网站| 中文字幕乱码免费在线视频| 江川县| 青青草综合在线观看视频| 久久久久无码精品国| 中文字幕亚洲第一页在线| 亚洲一区二区三区日韩精品四区| 亚洲乱码中文字幕综合69堂| 丝袜 亚洲 另类 欧美| 中文字幕丝袜人妻av| 高清高速无码一区二区| 广州市| 都江堰市| 亚洲欧洲美洲无码精品va| 国产精品一区二区日韩精品| 国产精品欧美视频另类专区| 69堂在线无码视频2020| 山东| 久久婷婷国产精品简爱av| 镇平县| 富源县| 鹰潭市| 武宁县| 扎赉特旗| 日韩人妻系列在线视频| 杭锦后旗| 久久99久久99精品免观看女同| 桂阳县| 临江市| 国产成人无精品久久久| 人妻夜夜爽av性色大片| 郸城县| 精品国免费一区二区三区| 加勒比在线一区二区三区| 高邑县| 国产免费自拍av一区| 国产麻豆放荡av激情演绎| 五月婷婷激情视频俺也去淫|