简述如何制作 zTree v3.x 系列的扩展 js 库

原创
2012/06/29 15:53
阅读数 2.6K


    zTree v3.x 版本修改了结构,将原先混在一起的代码进行了拆分,调整了内部结构。目前的结构可以比较方便灵活的用插件形式覆盖核心代码或开发自己的新功能,而又不用去特意修改核心代码,也便于以后的 zTree 代码升级。


    因为这两天准备要开始进行 zTree v3.3 中扩展功能的开发,故趁机简单介绍一下如何制作 zTree v3.x 的扩展 js 库。


    为了便于浏览,我利用 jquery.ztree.excheck-3.2.js 的代码结构来讲解。

一、扩展库代码最外层结构

//利用匿名函数 将作用域保护起来
//注意:一定要先加载 jQuery 以及 zTree 的js,最后加载 扩展库。 如果放在一个文件中,也要将 扩展库的代码放在最后
(function($){
   // 在这里面进行全部的操作
   .....
})(jQuery);

二、扩展库内部结构

    下面的结构可以直接对照 excheck 和 exedit 两个js 来比较,就可以快速了解代码结构,从而开发出自己需要的扩展库了。 另外,对于不需要的功能,完全可以进行相应的删除,避免多余代码。

(function($){

	//default consts of exLib
	//这里保存 zTree 内部需要的常量
	var _consts = {},

	//default setting of exLib
	//这里保存 zTree 需要的配置信息(完全可以利用这个为自己的项目制作 zTree 的公共默认配置,减少页面代码)
	_setting = {},

	//default root of exLib
	//设置 zTree 内部基本属性(初始化时执行)
	_initRoot = function (setting) {},

	//default cache of exLib
	//设置 zTree 内部的缓存初始化(初始化时执行)
	_initCache = function(treeId) {},

	//default bind event of exLib
	//设置 zTree 内部事件回调函数(初始化时执行)  例如:onCheck等
	_bindEvent = function(setting) {},

	//default event proxy of exLib
	//设置 zTree 事件代理中的处理逻辑,根据不同事件跳转到不同的 handler 处理 ( *** 参考 excheck 代码,如果使用必须 return proxyResult  *** ) 
	_eventProxy = function(e) { ... return proxyResult;},

	//default init node of exLib
	//设置 节点数据初始化的处理(加载节点时执行)
	_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {},

	//add dom for check
	//专门用于在节点<a>之前生成 DOM 使用,主要用于 checkbox & radio
	_beforeA = function(setting, node, html) {},

	//update zTreeObj, add method of exLib
	//设置 zTreeObj 的各种对外方法,可以制作新的接口也可以覆盖已有接口
	_zTreeTools = function(setting, zTreeTools) {
//		zTreeTools.xxx1 = function() {}
//		zTreeTools.xxx2 = function() {}
	},

	//method of operate data
	//定义 zTree 节点数据操作的方法
	_data = {},

	//method of event proxy
	//定义 zTree 各种事件绑定 & Proxy 的方法
	_event = {},
	
	//method of event handler
	//定义 zTree 事件处理的方法
	_handler = {},
	
	//method of tools for zTree
	//定义 zTree 内部的工具方法
	_tools = {},
	
	//method of operate ztree dom
	//定义 zTree 视图相关的方法
	_view = {},

	//将本扩展库内的方法、属性注入到 core 中
	_z = {
		tools: _tools,
		view: _view,
		event: _event,
		data: _data
	};
	$.extend(true, $.fn.zTree.consts, _consts);
	$.extend(true, $.fn.zTree._z, _z);

	//获取几个主要的全局对象
	var zt = $.fn.zTree,
	tools = zt._z.tools,
	consts = zt.consts,
	view = zt._z.view,
	data = zt._z.data,
	event = zt._z.event;

	//针对 zTree 初始化进行注入新内容
	
	//合并 配置 setting
	data.exSetting(_setting);

	//添加 绑定事件处理
	data.addInitBind(_bindEvent);
	//添加 初始化 Cache 方法
	data.addInitCache(_initCache);
	//添加 初始化 节点数据 方法
	data.addInitNode(_initNode);
	//添加 初始化 事件代理 方法
	data.addInitProxy(_eventProxy);
	//添加 初始化 zTree 内部基本属性 方法
	data.addInitRoot(_initRoot);
	//添加 初始化节点 <A> 之前的DOM 方法
	data.addBeforeA(_beforeA);
	//添加 zTreeObj 对象的对外接口
	data.addZTreeTools(_zTreeTools);

	//对原始内部方法进行功能扩展,但不完全覆盖
//	Override method in core
	
	//这段代码是从 excheck 中直接提取出来的,供参考
//	var _createNodes = view.createNodes;
//	view.createNodes = function(setting, level, nodes, parentNode) {
//		if (_createNodes) _createNodes.apply(view, arguments);
//		if (!nodes) return;
//		view.repairParentChkClassWithSelf(setting, parentNode);
//	}
	
})(jQuery);
 

补充,敬请恭候 v3.3 中将发布的几个新的扩展库....

展开阅读全文
打赏
4
18 收藏
分享
加载中

引用来自“zTree”的评论

引用来自“senge”的评论

上面的代码,真心没有看懂

这仅仅是针对 zTree v3 版本的扩展方式,如果你不了解 zTree 那么看不懂没什么的。 如果你研究了 zTree 的源码以及结构以后,还是感觉看不懂,那么不排除是我写的内容有问题,请告诉我。

其实Ztree我从2.3的时候就开始在项目中使用,只是从来没有学习过源码,如时间充许,还请指教哦!
2012/07/06 10:13
回复
举报
zTree博主

引用来自“senge”的评论

上面的代码,真心没有看懂

这仅仅是针对 zTree v3 版本的扩展方式,如果你不了解 zTree 那么看不懂没什么的。 如果你研究了 zTree 的源码以及结构以后,还是感觉看不懂,那么不排除是我写的内容有问题,请告诉我。
2012/07/06 10:11
回复
举报
上面的代码,真心没有看懂
2012/07/06 09:57
回复
举报
终于做了这个教程了,以前也参照了做过,3.1升级到3.2后又大改了一次
2012/07/04 17:07
回复
举报
像楼主学习 :)
2012/07/03 20:36
回复
举报

引用来自“zTree”的评论

呵呵,怎么忽然就这么多人来看文章了...感谢各位!正在努力中!

Ztree项目做得很好,很喜欢,支持
2012/07/03 13:55
回复
举报
zTree在我们业务线得到大力推广,支持一下
2012/07/03 10:07
回复
举报
zTree确实是不错的。虽然我们系统中还没使用,但是还是很看好的。
2012/07/03 09:29
回复
举报
zTree博主
呵呵,怎么忽然就这么多人来看文章了...感谢各位!正在努力中!
2012/07/03 09:16
回复
举报
顶啊,这东西虽然还没用过,看起来就不错
2012/07/03 08:58
回复
举报
更多评论
打赏
18 评论
18 收藏
4
分享
返回顶部
顶部