第一步: 定义tree 的一些通用属性
var treeDefaultProps = {
fontSize: 12,
indent: 15, //层级间缩进量
height: 22, //条目的高度
spacing: 5, //行元素间距离
expandLevel: 1, //默认展开级别
cookieId: undefined, //是否将当前节点展开与否状态写入COOKIE, null不写入,若写入应指定些树的ID,以便与其它树实例区分
animateSpeed: 100, //动画速度, 为0则无动画
urlTarget: "_self", //绑定URL时,HREF目标
//控制图片相关
expandImg: "images/expand.png",
collapseImg: "images/collapse.png",
nodeImg: "images/node.png",
picTopPos: 0, //控制图片上下的定位距离,为负数上移,正数下移
fieldNameMap: { // 数据对象成员变量名映射
id: "id",
label: "label",
url: "url",
action: "action",
img: "img",
subTree: "subTree"
}
};
第二步: 扩展Jquery方法
if (jQuery) {
(function($){
//jquery扩展方法
$.fn.extend({
//tree扩展方法的名称,data 数据 properties 属性
tree: function(data, properties, render){
// 如果未传入配置属性对象,使用默认属性对象
var _properties = properties ? properties : treeDefaultProps;
// 要显示树的容器;调用者对象
var _container = this;
// _container.css("font-size", _properties.fontSize);
//渲染行的类实例
var _renderer = new Renderer(_properties);
//渲染行的方法
var _render = render ? render : defaultRender;
// 构建树DOM节点方法() ; 构造树
//nodeList 接点列表 level 层 (表示画到了第几层) ul指定li的ul
function drawNode(nodeList, level, ul){
//循环nodeList
for (var i = 0; i < nodeList.length; i++) {
//生成LI并设置样式及属性
var li = $("<li></li>").appendTo(ul);
//white-space:nowrap 不换行 line-height 行高 padding-left 左填充
li.css("list-style", "none").css("white-space:nowrap");
li.css("line-height", _properties.height + "px");
li.css("padding-left", _properties.indent);
//将li添加到传进来的ul当中
li.appendTo(ul);
//li当前的级别
li.level = level;
li.data = nodeList[i];
li.renderer = _renderer;
var curDataId = nodeList[i][_properties.fieldNameMap.id];
li.id = ul.id ? ul.id + "." + curDataId : curDataId;
li.attr("id", li.id);
//判断是否有子树
var curLiSubTree = nodeList[i][_properties.fieldNameMap.subTree];
li.hasChildren = curLiSubTree && curLiSubTree.length > 0;
// 如果有子菜单
if (li.hasChildren) {
// 初始化子层容器UL
var subUL = $("<ul style='margin:0;padding:0'></ul>").attr("id", li.id);
subUL.id = li.id;
li.ul = subUL;
// 处理UL可见性, 因为UL内对象在当前级的下级,所以将level+1做为级别参数
ulVisible(subUL, level + 1);
}
addControlImg(li); // 添加控制图片
_render(li);
if (li.hasChildren) {//递归处理,生成下级菜单
drawNode(curLiSubTree, level + 1, subUL);
subUL.appendTo(li);
}
}
}
//添加控制图片
function addControlImg(li){
//$("<img />").attr("src", "images/node.png").appendTo(li);
if (li.hasChildren) {
var img;
if (li.ul.visible) {//如果可见,显示减号
img = _renderer.addImg(li, _properties.collapseImg, _properties.picTopPos);
} else {//如果不可见,显示加号图片
img = _renderer.addImg(li, _properties.expandImg, _properties.picTopPos);
}
//展开折叠树的事件
img.click(function(){
var _thisImg = this;
//处理动画bug$("img, input").css("position", "") 去掉img 和input 的posttion属性
_properties.animateSpeed > 0 && (Browser.isIE(6) || Browser.isIE(7)) && $("img, input").css("position", "");
//slideToggle jquery 的动画方法_properties.animateSpeed 动画执行的时间,function方法是执行完成的回调方法
$(this).parent().children("ul").slideToggle(_properties.animateSpeed, function(){
//完成图片的切换
_thisImg.src = _thisImg.src.endWith(_properties.expandImg) ? _properties.collapseImg : _properties.expandImg;
//重新设置img 和position 的 position 属性
_properties.animateSpeed > 0 && (Browser.isIE(6) || Browser.isIE(7)) && $("img, input").css("position", "relative");
});
});
} else {
_renderer.addImg(li, _properties.nodeImg, _properties.picTopPos);
}
}
// 处理UL可见性
function ulVisible(ul, level){
if (_properties.cookieId) { //如果状态写入COOKIE,根据COOKIE值确定
} else { //根据展开级别属性确定
if (level > _properties.expandLevel) {
ul.css("display", "none");
ul.visible = false;
} else {
ul.css("display", "");
ul.visible = true;
}
}
}
//开始生成树
var rootUL = $("<ul style='margin:0;padding:0;'></ul>").css("margin-left", -parseInt(_properties.indent) + "px").appendTo(_container);
drawNode(data, 1, rootUL);
}
});
})(jQuery);
};
/**
* 条目渲染类
* @param {Object} prop
*/
var Renderer = function(prop){
this._properties = prop;
// 向条目行中加入图片
this.addImg = function(o, src, pos, alignType){
pos = pos ? parseInt(pos) : 0;
var img = $("<img/>").css("margin-right", parseInt(this._properties.spacing) + "px")//.css("position", "relative").css("top", pos + "px");
img.attr("src", src);
alignType && img.attr("align", alignType);
img.appendTo(o);
img.removeAttr("height");
img.removeAttr("width");
return img;
}
// 向行中加入文本
this.addLabel = function(o, text, callback, eventType){
var span = $("<span></span>").html(text).css("margin-right", parseInt(this._properties.spacing) + "px").css("cursor", "default").appendTo(o);
if (callback) {
eventType = eventType ? eventType : "click";
span.bind(eventType, callback);
span.css("cursor", "pointer");
}
return span;
}
//向行中加入链接
this.addLink = function(o, text, href, target){
var link = $("<a></a>").html(text);
link.attr("href", href);
link.attr("target", target);
o.append(link);
return link;
}
// 向行中加入复选框
this.addCheckbox = function(o, pos, id, callback, eventType){
pos = pos ? parseInt(pos) : 0;
id = id ? id : o.id;
var input = $("<input type='checkbox'/>").css("position", "relative").css("top", pos + "px").css("margin-right", parseInt(this._properties.spacing) + "px");
if (id) {
input.attr("id", id);
}
if (callback) {
eventType = eventType ? eventType : "click";
input.bind(eventType, callback);
}
input.appendTo(o);
return input;
}
}
/**
* 默认渲染条目方法
*/
function defaultRender(item){
var prop = item.renderer._properties;
var action = item["data"][prop.fieldNameMap.action];
var url = item["data"][prop.fieldNameMap.url];
// 如果指定了URL字段,绑定URL
if (url && url.trim().length > 0) {
item.renderer.addLink(item, item["data"][prop.fieldNameMap.label], url, prop.urlTarget);
} else if (action && action.trim().length > 0) { //如果有ACTION字段绑定ACTION
item.renderer.addLabel(item, item["data"][prop.fieldNameMap.label], function(){
if (typeof(action) == "string") {
eval(action);
} else if (action instanceof Function) {
action.call(this);
}
});
} else {
item.renderer.addLabel(item, item["data"][prop.fieldNameMap.label]);
}
}
数据:
var sampleData = [{
id: '001',
label: '系统管理',
url: '',
action: 'alert("hello");',
img: '',
subTree: [{ //下级菜单
id: '101',
label: '用户管理',
url: '',
action: '',
img: '',
subTree: [{ //下级菜单
id: '1011',
label: '外网用户',
url: 'http://www.baidu.com'
}]
}, {
id: '102',
label: '角色管理',
url: '',
action: '',
img: ''
}]
}, {
id: '002',
label: '基础数据',
subTree: [{ //子元素
id: '201',
label: '部门设置'
}, {
id: '202',
label: '设备型号设置',
subTree: [{
id: '2021',
label: '设备型号'
}, {
id: '2022',
label: '配件型号'
}]
}]
}];
相关推荐
在"json jquery simple tree 源码"中,这个扩展实现了将JSON数据用于jQuery Simple Tree的功能。JSON格式的数据非常适合异步加载,因为它可以高效地编码和解码,而且体积小,适合在网络上传输。在描述中提到,它可以...
首先,jQuery.tree的核心功能是通过jstree库实现的。jstree是一个轻量级的JavaScript库,提供了一整套完善的API和多种可定制的配置选项,用于创建具有拖放、搜索、多选、上下文菜单等丰富功能的树结构。它的优点在于...
**jQuery SimpleTree 插件详解** `jQuery SimpleTree` 是一个功能丰富的JavaScript插件,它扩展了jQuery库,为开发者提供了构建交互式树形结构的能力。这个插件特别之处在于它支持JSON数据格式,可以创建带有复选框...
jQuery.tree.js是基于jQuery库的一个插件,它利用JavaScript的事件驱动和DOM操作能力,实现了动态生成和管理树形导航菜单的功能。该插件不仅提供了丰富的配置选项,还支持各种交互效果,如点击展开/折叠节点、拖放...
jQuery CheckTree是一个专门用于创建这种功能的插件,它使得在网页上实现可勾选的树形结构变得非常方便。本文将深入探讨jQuery CheckTree的工作原理、主要功能以及如何在项目中进行应用。 首先,让我们了解jQuery ...
**jQuery Tree 控件详解** jQuery Tree控件是一种用于在网页上展示层次结构数据的JavaScript组件,它基于流行的jQuery库构建,提供了丰富的交互性和可定制性。这个控件可以帮助开发者轻松地创建可折叠、可展开的树...
jQuery 文件树(jQuery.fileTree)是一款基于 jQuery JavaScript 库的插件,用于在网页中以树形结构展示文件和目录。这款插件以其简洁、高效和易于定制的特点,深受开发者喜爱,尤其适用于需要用户交互式浏览和选择...
总结起来,jQuery Checktree是一个强大的树形选择工具,通过“jquery.checktree.js”的改进,现在可以实现节点的默认选中,增强了用户体验。配合“checktree.css”和“test.html”,我们可以快速理解和应用这个插件...
Light Treeview是jQuery Tree组件的一种实现,它以其轻量级和简洁的代码著称,适用于那些对性能有较高要求或者希望快速集成的项目。它提供了基本的展开/折叠节点、点击事件处理等核心功能,同时也支持自定义样式,...
动态生成树.rar"可能包含了使用jQuery实现树形结构的实例代码,可以解压查看具体实现细节。而"JqueryTree脚本.doc"则可能是关于jQuery Tree的使用指南或教程,包括如何初始化、添加节点、删除节点、展开/折叠节点等...
jsTree是一款基于jQuery的开源树形插件,它提供了丰富的功能和自定义选项,可以轻松实现网页中的可交互、动态展示的树结构。jsTree支持HTML、JSON等多种数据源,并且提供了搜索、拖放、上下文菜单、多选、异步加载等...
在IT领域,jQuery Tree是一种广泛使用的前端技术,用于创建交互式的树形菜单。这个压缩包包含四个不同的jQuery树形插件:zTree、jQuery UI Treeview、jQuery UI Draggable Tree和jQuery Simple Treeview。这些插件各...
**jQuery jsTree 知识详解** `jQuery jsTree` 是一个...通过熟练掌握jsTree的使用,可以提升项目的用户体验,实现更加直观和便捷的操作。不过,考虑到技术的不断发展,建议使用最新稳定版本以获取最佳性能和兼容性。
jQueryTree的异步加载功能主要通过API中的`data-url`属性实现,这个属性可以设置一个URL,当用户展开树形结构的某个节点时,jQueryTree会发送一个Ajax请求到该URL,获取子节点的数据。 **配置异步加载** 在使用...
本文将深入探讨jQuery Tree的核心特性、样式定制以及如何利用JQuery zTree v3.3实现多样化样式。 首先,jQuery Tree的基本概念是将HTML元素转化为可展开/折叠的节点结构,通常用于展现层级关系的数据,如目录结构、...
在本文中,我们将深入探讨jQuery Tree的实现原理、特点以及如何利用cookie实现记录用户上次查看的位置。 首先,jQuery UI 1.9.1是jQuery的一个扩展库,提供了丰富的用户界面组件,包括拖放功能、对话框、滑块、...
标签"jquery tree"进一步明确了这个示例的焦点,即使用jQuery来实现树形视图。 文件"jqTree"可能是包含这个例子的源代码或者相关资源。通常,这样的文件可能包括HTML文件用于展示结构,CSS文件用于样式,以及...
《jQuery Tree插件详解及其应用》 在前端开发中,数据的展示往往需要有层次结构,比如文件系统、组织架构等。此时,树形结构就成为了一种理想的展示方式。jQuery Tree是基于jQuery的一个插件,它使得在网页中创建...
**jQuery File Tree 插件详解** `jQuery File Tree` 是一个流行的前端文件浏览器插件,它利用 jQuery 库提供了一种交互式的、树状的文件系统导航方式。这个插件适用于那些需要在网页中展示服务器目录结构的应用场景...