开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧。之前呢,一直想写这个插件,然后错过了一个写这个插件的机会(这个得回顾到很久以前了。。。此处省去N个字)。然后最近“瘾”又犯了,呵呵,随手就拿这个“欠”了很久的插件开刀了。大家都应该知道“某宝”的这个插件写的还是很强大的,支持到街道(镇)级别。。。可见他们维护的前端数据有多大。。。不过呢,临渊羡鱼,不如退而结网,(毕竟也不算是很难理解、很牛X的插件)咱也就不用羡慕他们(这里不是我对他们不尊重,我个人是非常崇拜他们的技术的^_^。相信我们猿界大部分人都这样吧。。。),虽然我们不一定要写到他们那么精确镇级别,但是只要思想有了,我认为,剩下的也只是前端数据维护的问题了。。。我现在写的插件,支持到区县级,也就是省、市、县三级联动。下面呢,我会对插件开发流程做详细讲解。
第二部分:插件思想
在写思想之前,我还是想重复的说下,如果你想写好插件,请先多学下css布局(虽然我个人也不是很专业),多学下js前端框架设计(现在的前端框架多的数不胜数(夸张了),看自己需要选择了)。
先说下该插件的概念吧,所谓的省、市、县城市联动选择呢,额。。。感觉还是不说了吧,名字也很直观了(哈哈,我也是担心我解释过之后,你们乱了。。。本人表达不是很好,也相信大家的只上了^_^)。那么下面说下开发插件的思想吧。
(1)前端数据关系维护
数据源维护就是说中国各个省份名称、市级名称、区县级名称这三级数据的存储。有人可能会问,这些数据为啥不放到后台,存放到数据库中,前台的数据又不安全。通过前端发送ajax请求去获取去处理。对于这个问题,首先我们考虑到的服务器端的压力、包括用户体验(也就是响应速度了),这些都是理由,并且,这部分数据相对固定(难不成会随随便便出来个城市?),所以我们不需要考虑数据变化的情况,就算真的变了,那也好办,前端数据增量发布一次就好了(总不会天天有城市出来吧。。哈哈^_^),至于安全性嘛,你认为城市信息会很私密吗?呵呵,所以对于这个插件来说,数据安全方面不需要考虑太多的。
仔细的可能看到其中的“关系”两个字。前端的数据,不像存在后台数据库中,有所谓的外键关联。但是城市数据也需要有关联的啊,不然怎么知道下一级数据是啥呢。所以我们要设计出一个类似于“外键”思想的前端数据关系。这个说的很玄乎,其实也不是很难(当然也不是很简单喽),如果你想设计一个很简单的结构,例如,就把每个城市及下一级都维护一下,这样当然可以,那么问题来了,这样维护下去,key会有很多很多。这个不利于遍历了。(当然为啥要遍历,下面不会知道的!),所以,怎样去设计数据关系呢?这个问题其实也是这个插件的最主要问题了(先说明下,数据源是我从网上摘的一个,让我一个一个去写城市名称,我想我会崩溃的,哈哈,你懂的。^_^巧的是,设计思想就是我想要的,也是我所想的。虽然key上设计有点不同,但是意思都一样。算是巧合吧,省去了我不少的事情^_^),具体的数据格式呢,下面代码会写出来,这里就不贴代码了。
(2)json格式的参数传入
这里有必要说下,很多人写插件(或写一些公共方法),总是写一个方法,然后里面各种参数,稍微好一点的会添加一些参数说明,差一点的连个说明都没有,这样写插件,别人会去一个一个对应你的参数,担心顺序是否写错了、担心类型是否写错等等。。并且我下次再维护的时候,自己都不知道参数的含义了,还得会去查看插件封装。。。很烦的不是吗。所以我建议最好的形式是使用json数据格式,当然我建议就算用json格式也最好添加注释,这个是习惯,顺手加上而已,利人利己。通过键值对形式传参数,这样呢就解决了顺序呢问题和后期维护问题,并且后期维护时候,看到键也就能大体记起大概意思了。不要小看参数传入格式^_^
(3)前端架构解耦思想运用:委托、事件句柄
这两个思想我在前面的博客中都有提到,这里不再累述,目的就是,减少代码耦合度,对于前端,还可以巧妙的运用js作用域和作用域链,提高代码效率和降低代码复杂度。
第三部分:开发过程
开发过程简述(跟之前的差不多):
(1)首先还是分析需求,知道自己开发的插件最终的功能目的和最终的状态;
(2)封装公共部分;
(3)逻辑整合,代码实现;这里我还想说下就是要通过架构思想去整合代码,架构的目的是为了解耦,我这里用的是委托和事件句柄思想。
(4)经过一万次检测(就是要经过N此测试了,测试包括功能测试和浏览器兼容性以及响应速度测试);(这里呢,也要感谢我们项目的测试妹纸!!^_^)
(5)项目使用
这里面我想说明的一下就是,写的插件要使用通用性、复用性(同一页面多次使用)、可扩展性等等,除非没有必要,否则一定要考虑这点。还有就是,如果能有个专业测试帮你测,那么,你的插件将更加健壮。
通用性:就是没有特殊情况,任何时候都可以加载使用,不受业务限制;
复用性:就是同一个页面,可以多次使用(强调的是同一个页面,很多人写插件,喜欢把id或者一些其他标示写死,这样导致一个页面引用两个插件的时候回出问题!);
可扩展性:这个很好理解,就是要提供开放的扩展方式,不要把代码写的太死,为了适应各种业务需求,留有扩展空间。
还有一点想要多广大热衷于开发插件的同仁们说的,写插件之前,要把html、css功底打牢,你懂得^_^
第四部分:详细代码实现
(1)公共部门实现
$.citylinkage.init({contentId:"cityselect"//接收容器的id});第五部分:效果图
话不多说,直接上图(这里字不重要,看图!!!!)^_^
第六部分:总结
总结:对于功能上的,真不知道说些啥,总之看图吧,你懂得,哈哈^_^。。。
其实开发重在过程,怎样把你的想法通过字母组合,实现出来。。。开发不可能一帆风顺,每次都会遇到不同的问题,或大或小,都要通过自己各种度娘,其中的辛酸有谁知,呵呵,夸张了~这次开发还算顺利,没遇到特别难解决的问题,与其说是顺利,倒不如说是经验的积累吧。如果你不想一直都当猿,如果你还有着对狮的向往,如果你还有更好的追求,请多想多写!!这是给大家也是给我自己的勉励吧。。