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

如何使用jQuery Draggable和Droppable实现拖拽功能,第1张

主要功能需求说明:

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

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

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

第一步:左侧元素可以拖

官方给出的实例是直接在要拖动的元素上添加class="ui-widget-

content"。最初我是在所有要拖动的元素都添加了“ui-widget-content”类别。但是测试拖动结果,发现元素只能在它所在的

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": 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实现的跨容器无缝拖动效果具体如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

 <head>

  <meta http-equiv="Content-Type" content="text/html charset=utf-8" />

  <title>New Web Project</title>

  <link type = "text/css" href = "jquery-ui.css" rel = "stylesheet"/>

  <style type = "text/css">

   .EZ_SITE{width:990px position: relative margin:0px auto top:30px}

   .EZ_SITE_HEADER{width:990px position: absolute height:80px border:1px solid red}

   .ez_site_border{position: absolute width:100% height:100% background-color:#000}

   .ez_site_background{position: absolute width:100% height:100%background-color:#fff margin:0px}

   .EZ_SITE_PAGE{width:990px height:500px position: absolutetop:82pxborder:1px solid blue} 

   .ez_page_content{width:100% height:100% position: absolute}

   .EZ_SITE_FOOTER{width:990px position: absolute height:80px top:580pxborder:1px solid green}   

   #dragMe{

    position:absolute

    top:100px

    left:100px

    width:100px

    height:50px

    border:1px solid green

    line-height:50px

    cursor:move

    text-align: center

    z-index:999

    background:#008800

   }

   .box{

    position:absolute

    top:100px

    left:300px

    width:300px

    height:200px

    border:1px solid blue

    line-height:200px

    cursor:move

    text-align: center

    z-index:990

    background:#ddd

   }

  </style>

  <script type = "text/javascript" src = "jquery-1.7.1.min.js"> </script>

  <script type = "text/javascript" src="jquery-ui.js"> </script>

  <script type = "text/javascript">

   $(function(){

    var obj = {

       drop:function(e,ui){

        var handle = ui.helper,

         _left = handle.offset().left,

         _top = handle.offset().top,

         cleft = $(this).offset().left,

         ctop = $(this).offset().top

        handle.appendTo($(this)).css({

         left:_left-cleft,

         top:_top-ctop

        })

       }

    } 

    $("#addBox").click(function(){

     var $box = $('<div class = "box">box</div>')

     $box.appendTo($("#EZ_SITE_PAGE")).draggable().droppable(obj)

    })

    $("#dragMe,#box").draggable({

     containment:"#EZ_SITE"

    })

    $(".ez_page_content,#box").droppable(obj)

   })

  </script>

 </head>

 <body>

  <div id="EZ_SITE" class="EZ_SITE">

   <div id="EZ_SITE_HEADER" class="EZ_SITE_HEADER">

    <div class="ez_site_border">

     <div class="ez_site_background"></div>

    </div>

    <div class="ez_page_content">

     <div style="position: absolute top:20px left:30px">这是一个网站标题</div>

     <div style="position: absolute top:20px left:300px" class="mk-element-navigation">

      <a href="javascript:" id="index">主页</a>

      <a href="javascript:" id="product">产品</a>

     </div>

    </div>

   </div>

   <div id="EZ_SITE_PAGE" class="EZ_SITE_PAGE">

    <input type = "button" value = "添加容器" id = "addBox"/>

    <div class="ez_site_border" style="height:500px">

     <div class="ez_site_background"></div>

    </div>

    <div id="index" class="ez_page_content" style="opacity: 1" current="true">

     <div style="position: absolute top:20px left:30px font-weight: bold">这是一个主页面</div>

     <div id = "dragMe">dragMe</div>

    </div>

   </div>

   <div id="EZ_SITE_FOOTER" class="EZ_SITE_FOOTER">

    <div class="ez_site_border">

     <div class="ez_site_background"></div>

    </div>

    <div class="ez_page_content">

     <div style="position: absolute top:20px left:30px">这里是页脚</div>

    </div>

   </div>

  </div>

 </body>

</html>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11519329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存