JavaScript插件化开发教程(五)


Posted in Javascript onFebruary 01, 2015

一,开篇分析

Hi,大家好!前两篇文章我们主要讲述了以“jQuery的方式如何开发插件”,以及过程化设计与面向对象思想设计相结合的方式是如何设计一个插件的,两种方式各有利弊取长补短,嘿嘿嘿,废话少说,进入正题。直接上实际效果图:

JavaScript插件化开发教程(五)

大家看到了吧,这是一个下拉菜单插件,在我们日常开发中,系统提供的可能有时让我们觉得不是很美观并且功能有限,造成用户

的体验形式以及用户的可交互性不是很好,所以今天模拟一个嘿嘿嘿。下面就具体分析一下吧。

(二),实例分析

(1),首先确定这个插件做什么事。下面看一下插件的调用方式,以及配置参数说明。如下代码:

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

             }

         ] ,

         mode : "0" , // 为"1"时支持checkbox多选模式

         change : function(value){

             // put your code here

         }

     }) ;

     itemSelector.init() ;

     setTimeout(function(){

         console.log(itemSelector.getCurrentValue()) ; // 测试 获取当先选中项

     },2000) ;
 

“var itemSelector = new ItemSelector()”里面包含两个参数,第一个是dom节点对象,第二个是插件参数选项,"currentText"代表“ItemSelector“插件中,选中文本显示区域的文字描述。

”items“是一个数组,里面包含的是“ItemSelector”项目的属性,包括文字描述,选项值,”disabled“代表列表条目的可显度,0代表显示,1代表不可显示。

”change“代表选中时的操作回调函数,选项数据会以参数的形式进行回传。

(2),所涉的功能有哪些

可显的效果图如下:

JavaScript插件化开发教程(五)

不可显的效果图如下:

JavaScript插件化开发教程(五)

二者的区别是:不可现状态数据不会回传,悬浮上去不会有任何效果。

 三),完整代码以供学习,本代码已经过测试,包括目录结构以及相关的文件。

(1),html

 <body>

     <div class="dxj-ui-hd">

         大熊君{{bb}} - DXJ UI ------ ItemSelector

     </div>

     <div class="dxj-ui-bd">

         <div id="item-selector">

             <div class="title">

                 <div></div><span>↓</span>

             </div>

             <div class="content">

                 <div class="items">

                     

                 </div>

             </div>

         </div>

     </div>

 </body>

(2),css

 /* item-selector */ 

 #item-selector {

     margin : 0 auto;

     width : 220px ;

     overflow:hidden;

     border:2px solid #ccc;

 }

 #item-selector .title {

     border-bottom:1px solid #ccc;

     overflow:hidden;

 }

 #item-selector .title div {

     width:190px;

     border:0px ;

     color:#999;

     font-family: arial ;

     font-size: 14px;

     height:28px;

     line-height:28px;

     float:left;

     cursor:pointer;

 }

 #item-selector .title span {

     display:block;

     height:30px;

     line-height:30px;

     width:29px;

     float:left;

     text-align:center;

     border-left:1px solid #ccc;

     cursor:pointer;

 }

 #item-selector .content {

     width : 220px ;

     overflow:hidden;

 }

 #item-selector .content .items {

     overflow:hidden;

 }

 #item-selector .content .items div {

     padding-left:20px;

     width : 200px ;

     height:32px;

     line-height:32px;

     font-family: "微软雅黑" ;

     font-size: 14px;

     font-weight:bold;

     cursor:pointer;

 }

 .item-hover {

     background:#3385ff;

     color:#fff;

 }

 (3),"ItemSelector.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")) ;

} ;

(四),最后总结

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

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

(3),不断重构上面的实例,如何进行合理的重构那?不要设计过度,要游刃有余,推荐的方式是过程化设计与面向对象思想设计相结合。

    (4),下篇文章中会扩展相关功能,比如“mode”这个属性,为"1"时支持checkbox多选模式,现在只是默认下拉模式。

本文先到这里了,后续我们再继续讨论,希望小伙伴们能够喜欢本系列文章。

Javascript 相关文章推荐
提高网站性能之 如何对待JavaScript
Oct 31 Javascript
两种简单实现菜单高亮显示的JS类代码
Jun 27 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
Dec 25 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
Apr 10 Javascript
javascript手工制作悬浮菜单
Feb 12 Javascript
浅析JavaScript中的事件机制
Jun 04 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
Jul 22 Javascript
使用Angular.js实现简单的购物车功能
Nov 21 Javascript
如何在vue中使用ts的示例代码
Feb 28 Javascript
React事件处理的机制及原理
Dec 03 Javascript
微信公众号平台接口开发 菜单管理的实现
Aug 14 Javascript
node.js express捕获全局异常的三种方法实例分析
Dec 27 Javascript
对JavaScript中this指针的新理解分享
Jan 31 #Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 #Javascript
有效提高JavaScript执行效率的几点知识
Jan 31 #Javascript
JavaScript日期时间与时间戳的转换函数分享
Jan 31 #Javascript
JavaScript监听和禁用浏览器回车事件实例
Jan 31 #Javascript
JavaScript编程中容易出BUG的几点小知识
Jan 31 #Javascript
JavaScript实现的双向跨域插件分享
Jan 31 #Javascript
You might like
Protoss魔法科技
2020/03/14 星际争霸
BBS(php &amp; mysql)完整版(七)
2006/10/09 PHP
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
jquery 笔记 事件
2011/11/02 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
javascript中Function类型详解
2015/04/28 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
js闭包用法实例详解
2016/12/13 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
Python urlopen()函数 示例分享
2014/06/12 Python
Python入门篇之面向对象
2014/10/20 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
运动会广播稿60字
2014/01/15 职场文书
《分一分》教学反思
2014/04/13 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
煤矿安全保证书
2015/02/27 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
Node.js实现断点续传
2021/06/23 Javascript
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers