插件,在多人项目开发的过程中,是个很好的工具。它能够将复用的部分,封装成一个公共的接口,只需要写一遍,就可以在多人项目中,按照一定规则进行使用。
开发一个插件需要完成以下几步:
现在,按照上述罗列的四个步骤,一起探讨下,如何封装一个日期选择器插件吧。
需求背景:根据不同配置参数,需要动态可配的输入时间控件,再点击不同时间链接之后,返回一个时间值。时间值作为下次访问条件查询语句的参数。
技术难点:该需求,如果只封装成一个日期控件,方法较为简单,然后根据封装的控件,捕获点击事件,根据点击事件的值,进行相应操作。但,目前该插件封装出来,是给后台人员使用的,考虑到后端人员对前端的认识较为薄弱,因此想把点击后获取到的对一个标签值,当做一个string字符串,传递出来,以便后端人员进行下一步操作。该字符串的获取,需要有一个前提,即对日期控件进行点击,才读取值。因此该方法的难点就在于,如何将点击之后返回的值,直接return出来,并开接口传递到外界使用。
梳理步骤:设置自定义的日期数组、设置获取自定义配置参数方法、设置渲染的dom函数、设置回调的返回字符串函数、绑定 点击事件。
实际开发:
;(function($){
var JqDatepicker = function(JqDateObj){
};
JqDatepicker.prototype = {};
window.JqDatepicker = JqDatepicker;
})(window);
在该插件结构中,首先以(function($){})(window)立即执行函数形成闭包,前面的“;”是为了避免在引入文件末尾没分号情况下引起错误。利用函数形式,定义对象,并在prototype中预留函数定义入口。最后,将对象全局注册在window对象中。
$(function(){
var settings = {
'startTime': '2017-09-20',
'endTime': '2018-04-21'
}
var ele = new JqDatepicker($('.class'),settins);
})
在实例化过程中,通过设置默认配置参数,进行实例化。但这种情况下,需要将settings传递到插件的对象方法中,在插件开发过程中,更推荐放在标签属性中,如下面所示默认配置参数以标签舒心形式传递:
//设置默认参数,日期选择器的开始时间和结束时间
this.settings = {
'startTime': '2019/03-21',
'endTime': '2019/08-32'
};
$.entend(this.settings,this.getSettings());
//在prototype中定义getSettings函数
JqDatepicker.prototype = {
getSettings: function() {
var settings = this.JqdateObj.attr('data-param');
if (settings != "" || setting != undefined) {
return $.parseJson(settins)
} else {
return null;
}
}
JqDatepicker.init = function(JqDateObjs) {
var _this_ = this;
new _this_(JqDateObjs);
}
这种init方式中,能够初始化一个实例对象,在调用过程中,可以直接使用JqDatepicker.init($('.class'));
setDom: function () {
var dom_conditions = this.settings;
var dom_str,dom_html="";
dom_conditions.tagDate.forEach( function (value,index) {
( value.dayFlag ) ? ( dom_str = "第"+value.date+"天" )
: ( dom_str = "过去"+value.date+"天";)
dom_html = dom_html + '' +
dom_str + '';
});
this.JqDateObj.append(dom_html);
}
this.JqDateObj.find(".menu_date").bind('click',function () {
backString = $(this).html();
window.JqDatepicker.prototype.getBackString(backString);
});
getBackString: function (backString) {
JqDatepicker.params = backString;
return backString;
},
$('.menu_date').click(function () {
console.info(JqDatepicker.params);
});
$.fn.extend({
JqDatepicker: function () {
new JqDatepicker($(this));
return this;
}
});
至此,该插件就封装完毕了。后续将要利用原生js方式,继续将该插件进行封装。