如何使用jQuery Draggable和Droppable实现拖拽功能


Posted in Javascript onJuly 05, 2013

在以前的文章中我已经介绍了web开发中基本拖放原理,现在给出需要完成的功能。最后运行的效果如下图所示:

如何使用jQuery Draggable和Droppable实现拖拽功能

主要功能需求说明:
1.左侧的元素结构最后会通过Ajax call服务器的数据来生成,能支持多级元素。父节点可以折叠起来

2.用户可以通过拖放的操作,将元素从左侧拖放到右侧。如果是拖的父节点元素,那么需要把它子节点的元素一并拖到右边

3.元素放到右侧,右侧可以接受元素的区域有2种可能。一种新建一个区域,就类似“华东交通大学”所示。另外一种就是拖放到已经有元素的区域。两者的关系是“或”。单个元素区域有“非”和“且”的关系。点击右边删除按钮可以删除节点元素。

第一步:左侧元素可以拖
官方给出的实例是直接在要拖动的元素上添加class="ui-widget-content"。最初我是在所有要拖动的元素都添加了“ui-widget-content”类别。但是测试拖动结果,发现元素只能在它所在的container里面拖动,再往右拖动,div会出现水平或垂直滚动条。不知道是不是自己在参数设置上不对。container设置了overflow:auto。
效果如下图所示:如何使用jQuery Draggable和Droppable实现拖拽功能

因为最终的左侧元素节点是通过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事件,来判断用户在拖动元素。这步的原理如下图所示:

如何使用jQuery Draggable和Droppable实现拖拽功能

当用户拖动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": 0 }); 
//将点击的元素内容复制 
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": "0" }); }); 
//拖动元素时鼠标的位置 
var dragDivLeft = 0; 
var dragDivTop = 0; 
$("#draggableDiv").draggable({ containment: "parent", drag: function (event, ui) { $("#draggableDiv").css({ "width": "260px", "height": "22px" }); 
    $("#draggableDiv").append(clickElement); 
    var closeTop = $(".closeBar").offset().top; 
    dragDivLeft = event.target.offsetLeft; 
    dragDivTop = event.target.offsetTop; }, 
    stop: function () { 
        //拖拽结束,将拖拽容器内容清空 
        $("#draggableDiv").html(""); 
        $("#draggableDiv").css({"height":"0"}); } 
});

第三步:右边的元素可以放到指定的位置上
需要将元素拖到指定的区域里面,然后释放操作。完成“放”的操作。可以从上图看出,我是将元素的上边左边和下边缘的左边存到一个数组里面。然后在“拖”的过程中,一直记录了拖动的左边,放到右侧时,就可以判断当前元素将要放的位置。具体可以下载代码查看。
完成代码之后的效果图如下:
如何使用jQuery Draggable和Droppable实现拖拽功能

代码下载:DragandDrop.rar

Javascript 相关文章推荐
javascript 数组排序函数
Aug 20 Javascript
基于jQuery架构javascript基础体系
Jan 01 Javascript
js限制文本框只能输入数字(正则表达式)
Jul 15 Javascript
javascript列表框操作函数集合汇总
Nov 28 Javascript
Js数组排序函数sort()介绍
Jun 08 Javascript
原生js实现addClass,removeClass,hasClass方法
Apr 27 Javascript
jQuery插件autocomplete使用详解
Feb 04 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
Aug 22 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
Sep 11 Javascript
js实现百度淘宝搜索功能
Feb 17 Javascript
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
基于JavaScript 下namespace 功能的简单分析
Jul 05 #Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 #Javascript
js文件缓存之版本管理详解
Jul 05 #Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 #Javascript
把input初始值不写value的具体实现方法
Jul 04 #Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
Jul 04 #Javascript
简单实用jquery版三级联动select示例
Jul 04 #Javascript
You might like
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
php加密解密字符串示例
2016/10/13 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
php经典趣味算法实例代码
2020/01/21 PHP
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
子页向父页传值示例
2013/11/27 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
JavaScript中实现异步编程模式的4种方法
2014/09/24 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
学习Node.js模块机制
2016/10/17 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
python optparse模块使用实例
2015/04/09 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
介绍一下JNDI的基本概念
2013/07/26 面试题
房屋买卖委托公证书
2014/04/08 职场文书
2014年村官工作总结
2014/11/24 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
赞助商致辞
2015/07/30 职场文书
装修公司管理制度
2015/08/05 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python