在以前的文章中我已经介绍了web开发中基本拖放原理现在给出需要完成的功能最后运行的效果如下图所示
主要功能需求说明
左侧的元素结构最后会通过Ajax call服务器的数据来生成能支持多级元素父节点可以折叠起来
用户可以通过拖放的操作将元素从左侧拖放到右侧如果是拖的父节点元素那么需要把它子节点的元素一并拖到右边
元素放到右侧右侧可以接受元素的区域有种可能一种新建一个区域就类似“华东交通大学”所示另外一种就是拖放到已经有元素的区域两者的关系是“或”单个元素区域有“非”和“且”的关系点击右边删除按钮可以删除节点元素
第一步左侧元素可以拖
官方给出的实例是直接在要拖动的元素上添加class="uiwidget content"最初我是在所有要拖动的元素都添加了“uiwidgetcontent”类别但是测试拖动结果发现元素只能在它所在的 container里面拖动再往右拖动div会出现水平或垂直滚动条不知道是不是自己在参数设置上不对container设置了 overflow:auto
效果如下图所示:
因 为最终的左侧元素节点是通过Ajax访问后台返回json数据然后通过Javascript动态生成这种结构而已不能为动态生成的元素绑定drag事 件也就不能调用draggable方法所以我使用了一个称之“中间拖拽容易元素”这div一直在页面上只是默认不显示只要用户开始拖拽左侧的元 素时它就出现了当然这里需要自己手动添加很多代码
复制代码 代码如下:
<div id=
draggableDiv
class="ui
widget
content">
中间拖拽容器元素
</div>
<script type="text/javascript">
$("#draggableDiv")
draggable({
containment: "parent"
drag: function (event
ui) { console
log("拖拽中"); }
stop: function () { console
log("拖拽结束"); }
});
</script>
第二步将 要拖的元素内容复制到draggableDiv上实现拖动父节点时其下面的子节点元素也要拖放到右边如果是拖动的子节点元素就在右边直接显示子节 点元素父节点和子节点是相对的因为左侧树形结构的节点可以是无限级的所以一个元素既可能是子节点元素也会是父节点元素通过监听鼠标的 mousedown和mouseup事件来判断用户在拖动元素这步的原理如下图所示
当 用户拖动B节点时首先把B元素上的内容复制给draggableDiv元素当用户拖动B元素其实是拖动draggableDiv元素所以我们要计 算出我们点击的B元素的位置然后让draggableDiv在拖动时候显示正确的位置然后拖动就是draggableDiv元素用户看起来是拖动的 B节点元素
复制代码 代码如下:
var clickElement = null; $("
threepanels
ptreelist")
bind("mousedown"
function (event) {
//获取当前mousedown元素的内容
var itemContent = $(this)
html(); var draggableDiv = $("#draggableDiv");
$(draggableDiv)
css({ "display": "block"
"height":
});
//将点击的元素内容复制
clickElement = $(this)
clone();
var currentdiv = $(this)
offset(); $(draggableDiv)
css({ "top": currentdiv
top
"left": currentdiv
left }); draggableDiv
trigger(event);
//取消默认行为 return false; });
$("#draggableDiv")
mouseup(function (event) { $(this)
css({ "height": "
" }); });
//拖动元素时鼠标的位置
var dragDivLeft =
;
var dragDivTop =
;
$("#draggableDiv")
draggable({ containment: "parent"
drag: function (event
ui) { $("#draggableDiv")
css({ "width": "
px"
"height": "
px" });
$("#draggableDiv")
append(clickElement);
var closeTop = $("
closeBar")
offset()
top;
dragDivLeft = event
target
offsetLeft;
dragDivTop = event
target
offsetTop; }
stop: function () {
//拖拽结束
将拖拽容器内容清空
$("#draggableDiv")
html("");
$("#draggableDiv")
css({"height":"
"}); }
});
第三步右边的元素可以放到指定的位置上
需要将元素拖到指定的区域里面然后释放操作完成“放”的操作可以从上图看出我是将元素的上边左边和下边缘的左边存到一个数组里面然后在“拖”的过程中一直记录了拖动的左边放到右侧时就可以判断当前元素将要放的位置具体可以下载代码查看
完成代码之后的效果图如下
代码下载DragandDroprar