js插件实现步骤

本文详细介绍了Bootstrap中JavaScript插件的开发流程,包括立即调用的函数声明、插件核心代码、jQuery插件定义、防冲突处理和绑定触发事件等5个通用步骤。遵循这些步骤,开发者可以创建易于维护和高质量的插件代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bootstrap里提供的所有JavaScript插件都遵守了统一的实现步骤,好处自然就不用多说了,除了维护方便以外,学习和自定义其他插件也都很方便。要做到统一,需要有5个步骤,如图2-16所示。
加载中...
 

下面以alert插件为例(alert.js),来讲述一下如何实现标准的插件。

步骤1 定义一个立即调用的函数声明,如代码清单2-1所示。在参数里传入jQuery对象,通过参数$引入变量,这样其所有代码在使用jQuery的时候,直接使用$符即可。这样的做法,有以下两个好处:

函数内部的$符变量代表了局部变量,而不是全局变量里代表jQuery的$符变量,以达到防止变量污染的目的。

内部的代码全部都是私有代码,外部代码无法访问,只有通过第三步,在$.fn上设置了插件(比如$.fn.alert=)的形式,通过$符变量才能将整个插件通过唯一的接口$.fn.alert暴露出去,从而保护了其内部代码。

代码清单2-1 立即调用的函数
+function ($) {
    "use strict";// 1.使用严格模式ES5支持
    // 2.alert插件类及原型方法的定义
    // 3.在jQuery上定义alert插件,并重设插件构造器
    //  重设插件构造器,可以通过该属性获取插件的真实类函数
    // 4. 防冲突处理
    // 5. 绑定触发事件
}(window.jQuery);

 注意

在function关键字前面有一个加号运算符(+),其主要目的是防止前面有未正常结束的代码(通常是遗漏了分号),导致前后代码被编译器认为是一体的,从而导致代码运行出错。

步骤2 定义该插件的核心代码,也就是在触发特定行为(通常是单击行为)后要进行处理的代码。示例如代码清单2-2所示。

代码清单2-2 插件核心代码示例
// alert插件类及原型方法的定义
// 定义选择器,所有符合该自定义属性的元素都可以触发下面的事件
var dismiss = '[data-dismiss="alert"]'
var Alert = function (el) {
    // 传入元素,如果元素内部有dismiss上设置的自定义属性,则click事件会触发原型上的close方法
    $(el).on('click', dismiss, this.close)
}
Alert.prototype.close = function (e) {
    // 关闭警告框的主要代码设置,每一行代码的细节注释,请参考5.8节
}

通过上述代码可以看出,主要是先定义了插件插件的类函数Alert,然后再定义需要用到的一些原型函数,比如close函数方法。Alert函数接收el参数,el表示DOM元素,一个DOM如果绑定了data-dismiss="alert"自定义属性,则在单击的时候就会触发close函数方法,从而达到关闭的目的。同样,Modal插件也是先定义Modal类函数,然后再在Modal的原型上定义toggle和show等方法,其内部根据相应的规则再细化处理。

步骤3 在jQuery上定义插件,以便通过jQuery.[插件名称]()的方式,也能够使用该插件,也就是在触发特定行为(通常是单击行为)后要进行处理的通用代码。最后在这里再调用插件类或原型方法。主要源码如代码清单2-3所示。

代码清单2-3 jQuery插件定义
// 在jQuery上定义alert插件,并重设插件构造器
var old = $.fn.alert
// 保留其他插件的$.fn.alert代码(如果定义),以便在noConflict之后,可以继续使用该旧代码
$.fn.alert = function (option) {
    return this.each(function () {
        // 根据选择器,遍历所有符合规则的元素,然后在元素上绑定插件的实例,以监控用户的事件行为
    })
}
$.fn.alert.Constructor = Alert;// 并重设插件构造器,可以通过该属性获取插件的真实类函数

jQuery插件的定义使用了标准的方法,在fn上进行扩展。在附加扩展之前,首先“备份”之前插件(或别的框架提供的同名插件)的旧代码,以方便在后面防冲突的时候使用。在附加扩展之后,重新设置插件的构造器(即Constructor属性)为内部定义的插件类函数自身,这样就可以通过Constructor属性查询到插件的真实类函数,使用new操作符实例化$.fn.alert的时候也不会出错。

 注意

即便不声明第三步,HTML声明式的方式也是可以用的。所以说,第三步是专门为某些喜欢用JavaScript代码触发事件的人所准备的。但需要注意的是,如果不声明第三步,那第四步的防冲突的功能也就没法用了。

步骤4 防冲突处理,目的是让Bootstrap插件和其他UI库的同名插件共存。Bootstrap所有的插件都支持防冲突(noConflict)功能。源码如代码清单2-4所示。

代码清单2-4 防冲突处理
// 防冲突处理
$.fn.alert.noConflict = function () {
    $.fn.alert = old // 恢复以前的旧代码
    return this  // 将$.fn.alert.noConflict()设置为Bootstrap的alert插件
}

这样一旦有了一个同名的插件,比如A库里有个同名$.fn.alert插件,则Bootstrap在执行之前就通过old先备份了,然后执行$.fn.alert.noConflict()后就会还原该old对象插件;而使用Bootstrap的alert插件的话,则通过var alert=$.fn.alert.noConflict()的形式,将Bootstrap的alert插件转移到另外一个变量上,从而进行使用。

步骤5 在一切都就绪之后,绑定默认的触发事件。由于已经为jQuery提供了默认的$.fn.alert扩展插件功能,已经可以通过手工编写JavaScript代码来触发事件了。这里的第五步主要是为声明式的HTML触发事件,即:在HTML文档里已经按照布局规则声明了相关的自定义属性(比如data-dismiss="alert"),然后通过这里的代码初始化默认的单击事件行为(或其他相关插件需要用到的行为)。绑定触发事件的源码如下所示:
// 绑定触发事件
// 为声明式的HTML绑定单击事件
// 在整个document对象上,检测是否有自定义属性data-dismiss="alert"
// 如果有,则设置:单击的时候,关闭指定的警告框元素
$(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)

上述代码在整个document文档上检测自定义属性data-dismiss="alert",如果有,则绑定click单击事件(在命名空间bs.alert.data-api上),事件回调函数则是原型方法Alert.prototype.close。这样,一旦单击了相应的元素,就会关闭特定的警告框。

Bootstrap通过这5个通用步骤,定义了所有的插件。每个插件在各个步骤里会有一些细节的不同,但思路都是一样的,那就是:绑定事件,触发行为,并在jQuery上扩展fn,同时解决防冲突的问题。大家在制作自定义插件的时候只要遵从这一思路,即可编写出既易于维护又高质量的插件代码。

 跨浏览器,可兼容IE7--IE10, FireFox, Chrome, Opera等几大内核的浏览器,且不需要浏览器再加装任何控件。  多系统兼容性、可移植性:由于只包括前台UI,因此二次开发者可很方便将本插件用在任何一种需要流程图的B/S系统应用上,流程图的详细实现逻辑完全交于后台程序开发者自己实现;对于后台,只要能返回/接收能被本插件解析的JSON格式数据即可.所以本插件可用于不同的服务器语言建立的后台上.  跨领域:流程图设计器不止用在电信领域,在其它需要IT进行技术支持的领域中都有重大作用.  以下从纯技术实现层面具体描述:  页面顶部栏、左边侧边栏均可自定义;  当左边的侧边栏设为不显示时,为只读状态,此时的视图区可当作是一个查看器而非编辑器。  侧边工具栏除了基本和一些流程节点按钮外,还自定义新的节点按钮,自定义节点都可以有自有的图标、类型名称,定义后在使用可可在工作区内增加这些自定义节点。  顶部栏可显示流程图数据组的标题,也可提供一些常用操作按钮。  顶部栏的按钮,除了撤销、重做按钮外,其余按钮均可自定义点击事件。  可画直线、折线;折线还可以左右/上下移动其中段。  具有区域划分功能,能让用户更直观地了解哪些节点及其相互间的转换,是属于何种自定义区域内的。  具有标注功能,用橙红色标注某个结点或者转换线,一般用在展示流程进度时。  能直接双击结点、连线、分组区域中的文字进行编辑  在对结点、连线、分组区域的各种编辑操作,如新增/删除/修改名称/重设样式或大小/移动/标注时,均可捕捉到事件,并触发自定义事件,如果自定义事件执行的方法返回FALSE,则会阻止操作。  具有操作事务序列控制功能,在工作区内的各种有效操作都能记录到一个栈中,然后可以进行撤销(undo())或重做(redo()),像典型的C/S软件一样。  0.4版中,加入了只导出在初始载入后被编辑的流程图中,只作了增删改等变更的元素,这样可用于用户快速存储,只保存本次变更过的内容,不用重新保存整个流程。  0.5版中,结点的样式不再受到原有程序的限制,所有样式均默认为淡蓝色长方形;如果要指定为圆形,可在初始化时定义结点类型为”原有类型”+” round”;如果要指定为复合结点,则可在初始化时定义结点类型为”原有类型”+” mix”。”原有类型”+” myType”:myType可为自己写的一种特殊样式类.  0.6版中,修正了一些BUG,改善了用户操作体验,并增加在可编辑状态下时,能用键盘上DELETE按键对元素进行删除功能。  0.7版中,修正了一些BUG,增加了连线变更要连的起始结点或结束结点的功能。  0.8版,取消原来的拟物化页面,变成如今的扁平化页面,并且支持主要位置的颜色自定义功能(如果想沿用原来老版本中的拟物化页面,只需保留原来的GooFlow.css文件即可);修正0.7版中的画线BUG。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值