ztree树形插件
在开发项目中需要用到树插件,近期研究了几款树插件,好记性不如烂笔头 ,写下来 以后好查
MzTreeView(梅花雪) 很经典的树形菜单脚本控件 菜单树展示加载速度快 支持1w条以上大数据
缺点--不能动态修改 刷新 兼容性不好 官网没有再继续维护
最近因开发需求在寻找开源树形插件 研究了一下ztree --jQuery 树插件,很不错的一款树形插件 关键是兼容性比较好
网址:http://www.ztree.me/v3/main.php#_zTreeInfo
- zTree v3.0 将核心代码按照功能进行了分割,不需要的代码可以不用加载
- 采用了 延迟加载 技术,上万节点轻松加载,即使在 IE6 下也能基本做到秒杀
- 兼容 IE、FireFox、Chrome、Opera、Safari 等浏览器
- 支持 JSON 数据
- 支持静态 和 Ajax 异步加载节点数据
- 支持任意更换皮肤 / 自定义图标(依靠css)
- 支持极其灵活的 checkbox 或 radio 选择功能
- 提供多种事件响应回调
- 灵活的编辑(增/删/改/查)功能,可随意拖拽节点,还可以多节点拖拽哟
- 在一个页面内可同时生成多个 Tree 实例
- 简单的参数配置实现 灵活多变的功能
后续继续更新自己研究的内容
由于官网的Demo 异步都是用php代码编写,于是自己动手了写了几个简单的Demo
1、只作树的展示(异步)使用的是简单树
脚本:需要引用JQuery、jquery.ztree.core-3.5.js 类库
function setting() {
var setting = {
data: {
view: {
dblClickExpand: false
},
simpleData: {
enable: true
}
},
async: {
enable: true,
url: "GetTreeData.aspx",
autoParam: ["id", "name", "level"],
otherParam: { "otherParam": "zTreeAsyncTest", "Method": "GetTreeData", "casetype": $("input:radio:checked").val() },
dataFilter: filter
},
callback: {
beforeClick: beforeClick
}
};
return setting;
}
function filter(treeId, parentNode, childNodes) {
if (!childNodes) return null;
for (var i = , l = childNodes.length; i < l; i++) {
childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
}
return childNodes;
}
//单击进行刷新
function beforeClick(treeId, treeNode) {
var check = (treeNode && !treeNode.isParent);
//如果是父节点单击打开子节点
if (!check) {
var zTree = $.fn.zTree.getZTreeObj("tree");
//只展开本节点的第一级子节点
zTree.expandNode(treeNode, true, false, true);
//可通过单击进行刷新和展开
// if (treeNode.zAsync) {
// //已经异步加载过的强制重新加载(刷新)
// zTree.reAsyncChildNodes(treeNode, "refresh", null);
// }
// else {
//单击展开
// zTree.expandNode(treeNode, true, true, true);
// }
}
return true;
}
$(document).ready(function () {
$.fn.zTree.init($("#tree"), setting());
$("input:radio").change(function () {
$.fn.zTree.init($("#tree"), setting());
});
//刷新
$("#btnrefresh").click(function () {
var zTree = $.fn.zTree.getZTreeObj("tree");
var selectednotes = zTree.getSelectedNodes();
//获取的是集合
//必须通过循环进行加载获取选中的子节点
for (var i = , l = selectednotes.length; i < l; i++) {
// alert(selectednotes[i].name);
zTree.reAsyncChildNodes(selectednotes[i], "refresh", null);
}
});
});
前台页面:
做一个可以切换的树
<input type="radio" value="USECASE" name="ustype" id="usecase" checked="checked" />用例
<input type="radio" value="CR" name="ustype" id="CR" />CR
<img src="../../../Images/reload.png" id="btnrefresh" style="cursor: pointer" />
<fieldset style="overflow: auto" style="height: 500px">
<div class="zTreeDemoBackground left">
<ul id="tree" class="ztree">
</ul>
</div>
</fieldset>
后台请求数据页面处理:
GetTreeData.aspx
//根据请求的数据拼接代码生成Json对象
protected void Page_Load(object sender, EventArgs e)
{
if (!LTMS.BLL.PRM.UserInfo.CheckUserLogin(Page, out _LoginUser)) { return; } if (Request.Params["id"] != null)
{
ID = Request.Params["id"].ToString();
}
else
{
ID = "";
} if (Request.Params["level"] != null)
{
Level = Request.Params["level"].ToString();
}
else
{
Level = "-1";
} if (Request.Params["Method"] != null)
{
Method = Request.Params["Method"].ToString();
} if (Request.Params["casetype"] != null)
{
CaseType = Request.Params["casetype"].ToString();
} //映射
Type type = this.GetType();
MethodInfo method = type.GetMethod(Method);
if (method != null)
{
method.Invoke(this, null);
}
} /// <summary>
/// 获取用例库
/// </summary>
/// <returns></returns>
public void GetTreeData()
{
IList<SWT_UseCase_Module_Model> _infos;
StringBuilder jsonstr = new StringBuilder(); if (Level == "-1")
{
//用例库顶级大节点,需要经权限筛选
_infos = UseCaseModule.GetListArray("UseCase", , _LoginUser, CaseType, "");
//_infos = UseCaseModule.GetListArray("UseCase", _LoginUser);
}
else
{
//非用例库顶级大节点,无需权限筛选
//_infos = UseCaseModule.GetTreeData(Convert.ToInt64(ID));
_infos = UseCaseModule.GetListArray(new string[] { "MODULE_FATHERID=" + ID });
} ///创建资讯树
string url = "ModuleContent.aspx?id="; foreach (SWT_UseCase_Module_Model _mode in _infos)
{
//换行需要json转义
jsonstr.AppendFormat("{{\"id\":{0},\"name\":\"{1}\",\"pId\":{2},\"url\":\"{3}\",\"target\":\"{4}\"", _mode.Module_ID, _mode.Module_Name.Replace("\n", " ").Replace("\r", " "), _mode.Module_FatherID, url + _mode.Module_ID + "&Type="+CaseType, "mid_frame");
if (UseCaseModule.ExistsBywhere("MODULE_FATHERID=" + _mode.Module_ID))
{
jsonstr.Append(",isParent:true");
}
jsonstr.Append("},");
} //移除最后一个,
if (jsonstr.ToString().EndsWith(","))
{
jsonstr = jsonstr.Remove(jsonstr.Length-, );
} _infos = null;
Response.Write("["+jsonstr.ToString()+"]"); }
2、用户搜索树控件
难点:ztree 在demo中的搜索只将搜索结果加粗显示 跟预期结果显示查询的结果不一致 解决这个问题,我采用的方式是将树清空 重新加载查询结果
主要是脚本页面
function dblClickExpand(treeId, treeNode) {
return treeNode.level > ;
}
function filter(treeId, parentNode, childNodes) {
if (!childNodes) return null;
for (var i = , l = childNodes.length; i < l; i++) {
childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
}
return childNodes;
}
//查询
function search() {
//搜索框为空时,重新绑定
if ($("#username").val() == "") { $.fn.zTree.init($("#tree"), setting()); return; }
//异步加载
$.ajax({
url: "../Control/GetNodes.aspx",
// url:"../Control/GetNodes.ashx",
type: "post",
dataType: "text",
async: true,
data: { "command": "GetSearchNodes", "group": $("input:radio:checked").val(), "username": $("#username").val() },
beforeSend: function () { $("#search").attr("disabled", "disabled").val("搜索中..."); },
success: function (data) {
//eval将返回来的json字符串转换成json对象
var json = eval(data);
$.fn.zTree.init($("#tree"), setting(), json);
},
error: function (textStatus, errorThrown) {
//请求出错处理
alert("错误:" + textStatus + errorThrown.toString());
},
complete: function () {
$("#search").attr("disabled", "").val("搜索");
}
});
}
//动态添加的元素不会有加载原来的脚本的事件 需要手动添加onclick事件
function deleteNodes(btnDelete) {
//parents过滤
$(btnDelete).parents("li").remove();
}
function beforeClick(treeId, treeNode) {
var check = (treeNode && !treeNode.isParent);
//如果是父节点单击打开子节点
if (!check) { var zTree = $.fn.zTree.getZTreeObj("tree"); zTree.expandNode(treeNode, null, true, true); }
// alert("只能选择人员...");
return check;
}
function onClick(e, treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("tree"),
nodes = zTree.getSelectedNodes(),
v = "";
nodes.sort(function compare(a, b) { return a.id - b.id; });
for (var i = , l = nodes.length; i < l; i++) {
//cursor:pointer; CSS 2.0 标准 google支持
v += "<li><span style='cursor:pointer;'><div class='selectednodes' onclick='deleteNodes(this)'>" + nodes[i].name + "<div></span></li>";
}
if (v.length > ) v = v.substring(, v.length - );
var SelectedObj = $("#selected");
SelectedObj.html(SelectedObj.html() + v);
}
//将设置转换成函数 --好处:设置参数里面有变量 ,可以定时获取最新的
function setting() {
var setting = {
data: {
view: {
dblClickExpand: false
},
simpleData: {
enable: true
}
},
async: {
enable: true,
// url:"../Control/GetNodes.ashx",
url: "../Control/GetNodes.aspx",
autoParam: ["id", "name", "level"],
otherParam: { "otherParam": "zTreeAsyncTest", "command": "GetChildrenNodes", "group": $("input:radio:checked").val(), "username": $("#username").val() },
dataFilter: filter
},
callback: {
beforeClick: beforeClick,
onClick: onClick
}
};
return setting;
}
$(document).ready(function () {
//过滤掉其他没用的enter
// document.onkeydown = function () {
// if (event.srcElement.type != 'button' &&
// event.srcElement.type != 'image' && event.srcElement.type != 'submit'
// && event.srcElement.type != 'textarea' && event.keyCode == 13)
// { event.keyCode = 9; }
// }
$(document).keydown(function () {
if (event.srcElement.type != 'button' &&
event.srcElement.type != 'image' && event.srcElement.type != 'submit'
&& event.srcElement.type != 'textarea' && event.keyCode == )
{ event.keyCode = ; }
});
//初始化
$.fn.zTree.init($("#tree"), setting());
//查询
$("#search").click(function () {
search();
// if ($("#username").val() == "") { $.fn.zTree.init($("#tree"), setting()); return; }
// $.fn.zTree.init($("#tree"), setting());
// var zTree = $.fn.zTree.getZTreeObj("tree");
//异步加载全部
});
$("#username").keydown(function () {
if (event.keyCode == ) {
search();
}
});
$("#btnOK").click(function () {
$("#hidden").val($("#selected").text().replace(/\.n/g, '').replace(" ", ','));
alert($("#selected").text().replace(/\.n/g, '').replace(" ", ','));
});
$("input:radio").change(function () {
//重置成空
$("#username").val("");
$("#selected").html("");
//重新加载
$.fn.zTree.init($("#tree"), setting());
});
});
Html页面
<fieldset style="width: 700px">
<div>
<input id="MIDH" type="radio" name="group" value="" />类别1
<input id="SYS" type="radio" name="group" value="" checked="checked" />类别2
</div>
<div>
<input type="text" style="float: left" id="username" />
<input type="button" value="搜索" id="search" />
<ul id="tree" class="ztree" style="float: left">
</ul>
<ul id="selected" class="ztree" style="float: left">
</ul>
</div>
</fieldset>
<br />
<input type="button" id="btnOK" value="确定" />
<input type="hidden" id="hidden" />
以上是我个人研究的一些东西写出来跟大家分享一下,有不合理的地方还望指正
作者:雨的点滴
出处:http://www.cnblogs.com/yudeyinji/articles/3488269.html
欢迎转载,但须保留版权
ztree树形插件的更多相关文章
- 项目一:第一天 1、项目概述 2、环境搭建(重点) 3、Jquery Easyui 前端UI框架 4、Jquery Ztree 树形插件使用
1.项目环境 注:添加jar包直接在common_parent里面添加. 搭建数据库 create tablespace bos317space datafile 'c:\ bos317.dbf' ...
- 插件使用一树形插件---zTree
zTree是一款挺好用的树形插件,中文文档齐全,demo丰富. 官方网站是 http://www.treejs.cn/v3/main.php#_zTreeInfo 源码网站 https://githu ...
- Bootstrap风格zTree树形菜单插件
这是一款bootstrap风格jQuery zTree树形菜单插件,支持自定义编辑.添加列表菜单.删除列表等功能的jQuery树形菜单代码.在线演示 具体代码实现: <!DOCTYPE html ...
- zTree树形菜单交互选项卡效果实现
1. 添加自定义属性 page 2. 为 ztree 每个树形节点,添加点击事件 <!DOCTYPE html> <html> <head> <meta ch ...
- zTree树形菜单使用实例
在每个节点添加 id 和 pid, id 表示当前节点编号,pid 表示父节点编号 第一步:在页面显示菜单位置,添加 ul设置 class=”ztree” 第二步:开启简单数据格式支持 第三步:编写树 ...
- 这是用过的"最差"树形插件
这是用过的"最差"树形插件 !!! 或许大家听过一个bootstrap UI框架---ace皮肤.有兴趣的童鞋可以在线查看:https://www.iteblog.com/ac ...
- easyui&8Jquery ztree树插件
7Jquery easyui前台UI框架 开发包: 7.1Layout页面布局 将课后资料中后台系统前台页面素材导入项目中 1.导入Jquery,easyui相关js,css文件 <link r ...
- 【treeview】 基于jQuery的简单树形插件
[treeview] 效果图: 前几天想把后台的目录结构通过树形插件的方法反映到前端来,在网上搜了半天只找到了这个treeview,虽然不是很好看,不过还是够用的..用treeview的前提是要有jq ...
- ztree树形菜单demo
阅读目录 zTree树形菜单 回到顶部 zTree树形菜单 树形菜单使用方式如下:HTML引入的方式如下: <!DOCTYPE html> <html> <head> ...
随机推荐
- 有关文件夹与文件的查找,删除等功能 在 os 模块中实现
最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模 ...
- Spring构造器注入、set注入和注解注入
记得刚开始学spring的时候,老师就反复的提到依赖注入和切面,平常的java开发中,在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,sp ...
- NSJSONSerialization(category)的一个扩展类
.h文件 // // NSJSONSerialization+Manage.h // SVPullToRefreshDemo // // Created by Fuer on 14-7-4. // C ...
- 二叉树的实现 -- 数据结构与算法的javascript描述 第十章
/** * 树,一种非线性的数据结构. 以分层的方式存储数据. * 一棵树最上面的节点成为根节点,如果一个节点下面有多个节点,这个节点称为父节点,下面的节点称为子节点 * 没有任何子节点的节点,陈宝国 ...
- IdeasToComeTrue
灵感这玩意,果真是有的吧.不考虑什么架构和盈利模式,就只是想到的有趣,随便写写,以飨流年. 我的头脑风暴:爱玩儿aiWaner 2015/08/22 换书: 每个人可能有很多闲置图书,自己看完了觉得好 ...
- Oracle中的日期和字符串互相转换
转载出处:http://blog.sina.com.cn/s/blog_44a005380100k6rv.html TO_DATE格式(以时间:2007-11-02 13:45:25为例) ...
- JavaScript中的构造函数
目录: constructor & prototype 为构造函数添加属性和方法的多种不同方法 组合使用this和prototype关键字创建构造函数(常用方法) 用对象直接量作为构造函数的参 ...
- svn版本控制
svn自动生成X.java.mine,X.java.r2333,X.java.r2368文件 这是你和别人的操作形成了冲突: 你和别人都从2333这个版本对X.java进行了修改, 别人先修改之后,先 ...
- Chain of Responsibility模式
熟悉VC/MFC的都知道,VC是“基于消息,事件驱动”,消息在VC开发中起着举足轻重的作用.MFC提供了消息的处理的链式处理策略,处理消息的请求将沿着预定好的路径依次进行处理.消息的发送者并不知道该消 ...
- Linux学习之Makefile文件的编写
转自:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html 目的: 基本掌握了 make 的用法,能在Linux系统上编 ...