zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述.

下面我将介绍如何实现使用该插件生成HTML元素Dom树,并对其进行多样操作.

先贴上一个简单的HTML页面(直接拿的ztree的用的,画面简单实用,里面的文字内容不用在意)

 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta charset="utf-8" />
<script src="../Scripts/jquery-2.2.4.min.js"></script>
<link href="http://localhost:83/Library/zTree_v3/css/zTreeStyle/zTreeStyle.css" rel="stylesheet" />
<script src="http://localhost:83/Library/zTree_v3/js/jquery.ztree.all-3.5.min.js"></script>
<script src="../Scripts/tree.js"></script>
<style type="text/css">
div#rMenu {
position: absolute;
visibility: hidden;
top: 0;
background-color: #555;
text-align: left;
padding: 2px;
} div#rMenu ul {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
vertical-align: baseline;
} .ztree {
margin-top: 10px;
border: 1px solid #617775;
background: #f0f6e4;
width: 220px;
height: 360px;
overflow-y: scroll;
overflow-x: auto;
} div#rMenu ul li {
margin: 1px 0;
padding: 0 5px;
cursor: pointer;
list-style: none outside none;
background-color: #DFDFDF;
}
</style>
</head>
<body>
<div class="content_wrap">
<div class="zTreeDemoBackground left" id="tree">
<ul id="treeDemo" class="ztree"></ul>
</div>
</div>
<div class="example">
<ul myid="1">
<li myid="2">
<h2 myid="3">实现方法说明</h2>
<ul myid="4">
<li myid="5">对于这种只有一个根节点,且不显示 +/- 开关的需求,需要利用 css、setting 配合使用</li>
<li myid="6">zTree v3.x 可以针对指定的 level,进行样式设定,请查看本页面源码,查看 css 设置</li>
<li myid="7">设置 setting.view.dblClickExpand 指向 Function,可以只针对根节点关闭双击展开的操作</li>
</ul>
</li>
</ul>
</div>
</body>
</html>

2JS文件(仅生成dom树),需要用到递归

 var zNodes = [], zTree, rMenu, $example;
function loopnodes(fathernode) {
var ret = [];
var children = $(fathernode).children();
children.each(function (i, em) {
var node = {
myid: $(em).attr('myid'),
name: $(em)[0].tagName + '|' + $(em).attr("myid"),
children: []
};
if ($(em).children().length > 0) {
node.children = loopnodes(em);
}
ret.push(node);
});
return ret;
}
$(document).ready(function () {
$example = $(".example");
zNodes = loopnodes($example);
zTree = treeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes);
});
var setting = {
edit: {
showRemoveBtn: false,
showRenameBtn: false,
}
};

这样就可以把指定的区域的元素遍历到dom树上,再根据官方提供的Apl,可以对其进行一系列的操作.

例如(举个简单例子,对应API很容易实现),点击dom树上的节点,对应的页面元素发生变化

 var setting = {
edit: {
showRemoveBtn: false,
showRenameBtn: false,
} ,
callback: {
onClick: zTreeOnClick,
}
};
function zTreeOnClick(event, treeId, treeNode) {
var myid = treeNode.myid;
$example.find('[myid="' + myid + '"]').css('color', 'red');
};

那么如何进行拖拽实现页面元素与dom树节点的变化了,首先,我们要明白ztree与位置变化相关的参数

先贴一个简单的拖拽代码

 var setting = {
edit: {
drag: {
prev: true,
inner: true,
next: true,
isMove: true,
isCopy: true
},
enable: true,
showRemoveBtn: false,
showRenameBtn: false
},
callback: {
beforeDrag: beforeDrag,
beforeDrop: beforeDrop
}
};
function beforeDrag(treeId, treeNodes) {
return true;
}
function beforeDrop(treeId, treeNodes, targetNode, moveType) {
return true;
}

我们需要需要关注的是beforeDrop,在拖拽落下的时候会传入的:

treeNodes:拖动的节点

targetNode:目标节点

moveType:拖动节点与目标节点的关系

我们确定拖动的节点所拖到的位置,就需要依靠moveType,它可能的值是

prev: 拖动节点在目标节点之前
inner: 拖动节点在目标节点之内
next: 拖动节点在目标节点之后
关于目标节点,可以参考下面内容:

当你要把 C 拖拽到 A 和 B 之间 的时候, 如果仅仅要鼠标移动到 A和B 之间的空间内操作起来实属不易, 所以必然是在 B 的偏上位置 或 A 的偏下位置 即可认为是  A、B之间, 并且这里面也有一些细微的区别:

在 A 偏下的时候, 你得到的 drop 的参数 target 是 A,moveType 是 next

在 B 偏下的时候, 你的道德 drop 的参数 target 是 B,moveType 是 prev

有了这层关系,很容易就可以完成拖拽dom树,页面元素跟随变化

 var setting = {
edit: {
drag: {
prev: true,
inner: true,
next: true,
isMove: true,
isCopy: true
},
enable: true,
showRemoveBtn: false,
showRenameBtn: false
},
callback: {
beforeDrag: beforeDrag,
beforeDrop: beforeDrop
}
};
function dropdrag(selectmyid, targetmyid, moveType) {
var currentelem = $example.find('[myid=' + selectmyid + ']');
var parentelem = $example.find('[myid=' + targetmyid + ']');
var content = currentelem.prop("outerHTML")
if (moveType == 'inner') {
parentelem.append(content);
currentelem.remove();
}
else if (moveType == "prev") {
parentelem.before(currentelem)
}
else {
parentelem.after(currentelem)
}
}
function beforeDrag(treeId, treeNodes) {
return true;
}
function beforeDrop(treeId, treeNodes, targetNode, moveType) {
var selectmyid = treeNodes[0].myid,
targetmyid = targetNode.myid;
dropdrag(selectmyid, targetmyid, moveType);
return true;
}

通过Ztree生成页面html元素Dom树,以及拖拽改变元素的位置的更多相关文章

  1. JavaScript动画-拖拽改变元素大小

    ▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...

  2. javascript动画系列第四篇——拖拽改变元素大小

    × 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...

  3. jquery插件之拖拽改变元素大小

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽改变元素大小的效果,您可以根据自己的实际需求来设置被 ...

  4. jQuery拖拽改变元素大小

    一个非常简单的例子,体验效果:http://keleyi.com/keleyi/phtml/jqtexiao/29.htm 以下是完整代码,保存到HTML文件打开也可以体验效果. <!DOCTY ...

  5. JQuery拖拽改变元素的尺寸

    "元素拖拽改变大小"其实和"元素拖拽"一个原理,只是所动态改变的对象不同而已,主要在于 top.left.width.height 的运用,相对实现起来也非常容 ...

  6. 从下拉菜单拖拽一个元素 出来,插入到页面中的app 列表中

    1,实现功能:从下拉菜单拖拽一个元素 出来,插入到页面中的app 列表中 并实现app向后移动一个元素的位置: 2.实现思路: 01.遍历下拉菜单,添加拖拽方法,实现位置移动功能: 02.遍历app列 ...

  7. easyui树节点拖拽排序的存储过程

    easyui树的拖拽排序功能 easyui树中有拖拽功能 树结构如下: 一个行政区域对应一个单位,一个单位对应多个部门,每个部门下有相关人员,功能要求: (1)行政区域没有子节点,点击text加载部门 ...

  8. 拖拽一个元素如此简单,mouse、drag、touch三兄弟的用处

    最近需要做一个投票活动,上传图片时需要拖拽.缩放来裁剪图片,vue的组件不少,不过自己动手才能丰衣足食,一味使用别人的组件实在难以进步,所以自己研究一番. 一.mouse.drag.touch傻傻分不 ...

  9. HTML5:一个拖拽网页元素的例子

    关键字:HTML5, Drag&Drop, JavaScript, CSS 运行环境:Chrome <!DOCTYPE html> <html> <head> ...

随机推荐

  1. ClearTrace

    一年前两次手动使用fn_trace_gettable对跟踪文件进行分析,按TextData排序,通过截取TextData左边N位尝试分组,观察总体相同的过程或语句中的关键字,逐一得出跟踪分析报表,罗列 ...

  2. Socket与Http通信

    HTTP(超文本传输协议): HTTP是应用层协议,主要用于解决数据包装的问题. HTTP协议是建立在TCP协议之上的一种应用. HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在 ...

  3. a biped was detected but cannot be configured properly (Bipe导入Unity 无法正确识别)

    OP stated "I export the biped with 'animation' and 'bake animation' ticked and the correct fram ...

  4. 接口测试(二)—HttpClient

    使用HttpClient进行接口测试,所需要使用的相关代码 HttpClient进行接口测试所需jar包:httpclient.jar.httpcore.jar.commons-logging.jar ...

  5. jQuery实现按enter键登录

    <script> $(document).keydown(function (event) { if (event.keyCode == 13) { $("#btn_Login& ...

  6. cmd光标移动

    ESC:清除当前命令行.F1: 单字符输出上次输入的命令 相当于方向键上的 → 的作用.F2: 可复制字符数量 , 输入上次命令中含有的字符,系统自动删除此字符后的内容.F3: 重新输入前一次输入的命 ...

  7. Flex 布局2

    Flex 布局2     你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我只列出代码,详细的语法解释请查阅<Flex布局教程:语法篇>.我的主要参考资料是Landon Sch ...

  8. 代码review之 isInfoEnable()

    上周没事扫扫系统原来的代码,突然发现这样一段代码: if(log.isInfoEnable()) { log.info("ID"+userID+"pwd"+us ...

  9. Nodejs express 文件上传

    文件上传 以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 enctype 属性设置为 multipart/form-data. index.htm 文件代码修改如下: <html ...

  10. css中子元素浮动,无法自动撑开父元素的解决办法

    <div> <div style="float:left;">left</div> <div style="float:righ ...