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 相关文章推荐
Jquery插件写法笔记整理
Sep 06 Javascript
jquery图片放大镜功能的实例代码
Mar 26 Javascript
javascript四舍五入函数代码分享(保留后几位)
Dec 10 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
Jun 09 Javascript
javascript中arguments,callee,caller详解
Mar 16 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
May 05 Javascript
利用BootStrap弹出二级对话框的简单实现方法
Sep 21 Javascript
bootstrap table 数据表格行内修改的实现代码
Feb 13 Javascript
vue-router之nuxt动态路由设置的两种方法小结
Sep 26 Javascript
使用vuepress搭建静态博客的示例代码
Feb 14 Javascript
vue实现防抖的实例代码
Jan 11 Vue.js
对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
PHP面向对象精要总结
2014/11/07 PHP
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
vuejs实现标签选项卡动态更改css样式的方法
2018/05/31 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
JS实现图片切换特效
2019/12/23 Javascript
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
python实现杨辉三角思路
2017/07/14 Python
python模块smtplib学习
2018/05/22 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
深入浅析Python的类
2018/06/22 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
python函数不定长参数使用方法解析
2019/12/14 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
仓库管理专业个人自我评价范文
2013/11/11 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
社区活动总结
2015/02/04 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
Django基础CBV装饰器和中间件
2022/03/22 Python
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server