Javascript插件开发教程(六)

Javascript插件开发教程(六)
首先,开放分析

我们今天该怎么说这篇文章呵呵,我们就在文章的最后调整不足逐步分析了它在一个浅的方式,让你有一个逐步完善的过程。少说话,进入点。让我们回到以前。

js代码的一部分,如下所示:

复制代码代码如下所示:

功能itemselector(元素、选择){

this.elem =元;

this.opts =选择;

};

无功isproto = itemselector.prototype;

isproto.getelem =函数(){

返回this.elem;

};

isproto.getopts =函数(){

返回this.opts;

};

*数据操纵 / *

ISProto。_setcurrent =功能(电流){

This.getOpts(){ } =电流电流;

};

isproto.getcurrentvalue =功能(电流){

返回this.getopts(){电流};

};

*数据操纵 / *

isproto.init =函数(){

var =;

this.getopts(当前){ } = null; / /数据指针

这个_setitemvalue(this.getopts()(currenttext ));

无功itemselem = that.getelem(),发现(。内容。项目);

This.getElem(),发现(。标题DIV ),(单击

ItemsElem.toggle();

});

This.getElem(),发现(。标题跨度),(单击

ItemsElem.toggle();

});

美元。每个(this.getopts()(项目},功能(我的项目){ }

项目{id=(新的日期()GetTime()ToString());

这_render(项目);

});

};

ISProto。_setitemvalue =函数(值){

This.getElem(),发现(。标题div)文本(价值)。

};

ISProto。_render =功能(项目){

var =;

无功itemelem = $()

文本(项目{文本)

attr(身份证。

如果(0=项目=禁用)

itemelem.on(单击

无功的变化= that.getopts(){改变};

that.getelem(),发现(。内容。项目)藏();

,_setitemvalue(项目{文本));

这_setcurrent(项目);

OnChange onChange(项);

})

.mouseover(函数(){()

$(这)。AddClass(项目悬停);

})

。mouseout(函数(){()

$(这)。RemoveClass(项目悬停);

});

}

别的{

itemelem.css(颜色

that.getelem(),发现(。内容。项目)藏();

,_setitemvalue(项目{文本));

});

}

ItemElem.appendTo(this.getelem(),发现(。内容。项目));

};
效果如下图所示:
(a)-非可操作状态
B)----可操作状态
(二)开放思路、结构调整

从代码中可以看出,它通过Js的语法特点,以面向对象的方式有效地组织起来。它比松散的形式化组织方式要好得多,但仍有许多不足之处。

(1)代码中重复的代码太多了。

(2)责任划分不明确。

(3)过程不完善。

我们基于上述要点进行了有效的重构,首先要对这个组件的需求进行排序,其功能点如下:

(1)初始化配置组件。

复制代码代码如下所示:

$(函数(){())

无功itemselector =新itemselector($(#项选择器),{

currenttext:请选择项目

项目:{

{

文本:

值:js

禁用:1

},

{

文本:CSS

值:CSS

禁用:0

},

{

文本:

值:html

禁用:0

}

},

});

ItemSelector.init();

});
此代码非常清晰,无需进行任何修改,但可以根据上述配置扩展功能,例如,添加配置项模式支持多个选项。

下面是完成初始化逻辑,如下所示:

复制代码代码如下所示:

isproto.init =函数(){

var =;

this.getopts(当前){ } = null; / /数据指针

这个_setitemvalue(this.getopts()(currenttext ));

无功itemselem = that.getelem(),发现(。内容。项目);

This.getElem(),发现(。标题DIV ),(单击

ItemsElem.toggle();

});

This.getElem(),发现(。标题跨度),(单击

ItemsElem.toggle();

});

美元。每个(this.getopts()(项目},功能(我的项目){ }

项目{id=(新的日期()GetTime()ToString());

这_render(项目);

});

};
这段代码有很多问题,责任不明确。初始化逻辑包含函数点的详细信息。

然后继续查看代码的呈现部分:

复制代码代码如下所示:

ISProto。_render =功能(项目){

var =;

无功itemelem = $()

文本(项目{文本)

attr(身份证。

如果(0=项目=禁用)

itemelem.on(单击

无功的变化= that.getopts(){改变};

that.getelem(),发现(。内容。项目)藏();

,_setitemvalue(项目{文本));

这_setcurrent(项目);

OnChange onChange(项);

})

.mouseover(函数(){()

$(这)。AddClass(项目悬停);

})

。mouseout(函数(){()

$(这)。RemoveClass(项目悬停);

});

}

别的{

itemelem.css(颜色

that.getelem(),发现(。内容。项目)藏();

,_setitemvalue(项目{文本));

});

}

ItemElem.appendTo(this.getelem(),发现(。内容。项目));

};
问题是显而易见的,已经找到了可重复的操作,应该进行合理的抽象,并实现重用的目的。

整个构建过程包括初始化、渲染(事件绑定)、相关的数据操作方法以及DOM操作的辅助方法。

总之,在简单梳理后,要确立运行目标函数和主要任务分配过程、职责。

所以我们重构的目的是明确的,对吗!它是抽象的功能点,友好分工的责任,我们如何做到这一点

第一步是建立过程函数方法:(方法接口)

复制代码代码如下所示:

isproto.init =函数(){

你在这里编码!

};

ISProto。_render =函数(){

你在这里编码!

};
第二部分,界面抽象方法的建立:

复制代码代码如下所示:

ISProto。_fnitemselectordelegatehandler =函数(){

你在这里编码!

};

ISProto。_fntriggerhandler =函数(){

你在这里编码!

};

ISProto。_addorremoveclass =函数(){

你在这里编码!

};
第三步是建立数据操作接口:

复制代码代码如下所示:

ISProto。_setcurrent =函数(){

你在这里编码!

};

ISProto。_getcurrent =函数(){

你在这里编码!

};
也有一些参考以下完整的源代码,这里只是说的想法。

(三)完整的学习代码,代码已经过测试。

复制代码代码如下所示:

功能itemselector(元素、选择){

this.elem =元;

this.opts =选择;

this.current = 1; / /数据指针

};

无功isproto = itemselector.prototype;

*吸气剂API

isproto.getelem =函数(){

返回this.elem;

};

isproto.getopts =函数(){

返回this.opts;

};

ISProto。_getcurrent =函数(){

返回this.current;

};

*吸气剂API

*数据操纵 / *

ISProto。_setcurrent =功能(电流){

this.current =电流;

};

ISProto。_setitemtext =功能(文本){

This.getElem(),发现(。标题div)的文本(text);

};

*数据操纵 / *
更新2015 1 / 31 / * * / 23:38

ISProto。_fntriggerhandler =函数(指数、文本值){

如果(这。_isdisabled(值)){

索引= 1;

文本= this.getopts(){currenttext};

}

这_setitemtext(文本);

这_setcurrent(指数);

This.getElem(),发现(。内容。项目)藏();

};

ISProto。_addorremoveclass =功能(元素、类名、Addis){

如果(Addis){

Elem.addClass(类名);

}

别的{

Elem.removeClass(类名);

}

};

ISProto。_fnitemselectordelegatehandler =函数(){

var =;

This.getElem()(),(单击

that.getelem(),发现(。内容。项目)的Toggle();

});

};

ISProto。_isdisabled =函数(值){

返回(1 = value):false;

};

Update on 2015 1/31 23:38 / * * /

isproto.init =函数(){

var =;

这_fnitemselectordelegatehandler();

美元。每个(this.getopts()(项目},功能(我的项目){ }

项目{索引= i;

这_render(项目);

});

这个_fntriggerhandler(这个。_getcurrent(),this.getopts()(currenttext},1 );

};

ISProto。_render =功能(项目){

var =;

无功itemelem = $()。文本(项目{文本})。Attr(身份

var =活动类一样(0 =项目{禁用)项目将:项禁用悬停;

itemelem.on(单击

,_fntriggerhandler(项目{指数},{项目文本},{禁用项目));

})

.mouseover(函数(){()

,_addorremoveclass($(this)、活动类一样,真的);

})

。mouseout(函数(){()

,_addorremoveclass($(this)、活动类一样,假);

});

ItemElem.appendTo(this.getelem(),发现(。内容。项目));

};

U3000 U3000

(四)最后摘要

(1)面向对象的思维方式是对功能需求的合理分析。

(2)以类的方式组织我们的插件逻辑。

(3)不断重构上述例子,如何进行合理的重构不要过分设计,要能轻松,推荐的方法是流程设计和面向对象设计的结合。

(4),下一篇文章将拓展相关功能,如模式属性,复选框支持多选模式是1

为了看看我是否比上一个代码好得多,我的合作伙伴应该更多地考虑他们自己的项目,并努力使他们的代码更加合理。

tag:开发教程插件电脑软件Javascript

相关内容