+ -
当前位置:首页 → 问答吧 → [修改功能] 仿物品栏拖放效果--jquery插件

[修改功能] 仿物品栏拖放效果--jquery插件

时间:2009-11-19

来源:互联网

原贴,可以浏览 http://bbs.blueidea.com/viewthread.php?tid=2922126&page=1&extra=page%3D1
我想实现 自由添加纵横个数,随意拖放在新加的栏目里边,,请问如何实现?
现在只能  先添加,再拖动
一旦按拖动之后,再添加一行的话,,整个脚本出错了。
我的Javascript技术有限,请指教!!
有时第一次运行代码的时候会出错,刷新一下就可以,不知是否论坛的问题!!
也可以直接可以浏览  http://www.gefly.net/code.htm  这里

复制代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[url=http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd]http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd[/url]">
  2. <html xmlns="[url=http://www.w3.org/1999/xhtml]http://www.w3.org/1999/xhtml[/url]">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>物品栏拖拽--Drag and Drop</title>
  6. <meta name="description" content="物品栏拖拽,拖放" />
  7. <meta name="keywords" content="物品栏拖拽,拖放" />
  8. <style type="text/css">
  9. *{margin:0;padding:0;}
  10. body{font:12px Verdana, Arial, "宋体", sans-serif;}
  11. h1{font-size: 18px;font-family: 微软雅黑;font-weight:normal;}
  12. h2{clear:both;font-size: 16px;margin: 0;padding: 5px;border-bottom: 1px solid #69c;color: #1a1;font-family: 微软雅黑;font-weight:normal;}
  13. h3{margin: 0;font-size: 14px;font-family: 微软雅黑;font-weight:normal;}
  14. p{clear:both;}
  15. .author{position:fixed;_position: absolute;right:20px;top:20px;}
  16. ul{clear:both;float: left;}
  17. /*格子拖放*/
  18. .grid li{float: left;list-style: none;width: 98px;height: 86px;border: 1px solid #ccc;background: #eee;margin: 5px;padding: 1px;-moz-user-select:none;text-align:center;}
  19. .grid img{width:98px;height: 68px;padding-bottom:4px;}
  20. .grid div{position: relative;}
  21. .grid span{position: absolute;right:1px;top:75%;color: #fff;}
  22. /*交换数据用的DIV*/
  23. #tempBox{position: absolute;z-index:9999;}
  24. /*单个拖放demo*/
  25. /*#test{clear:both;width: 500px;margin: 30px;padding: 10px;line-height: 24px;background: #ccc;}*/
  26. </style>
  27. <script type="text/javascript" src="[url=http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js]http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script[/url]>
  28. </head>
  29. <body>
  30.  <div style="padding:50px;">
  31.  <h1>拖放,拖拽,仿物品栏拖拽,请点击 << <a href="javascript:void(0);" onclick="startDrag()" >开始拖动</a> >> </h1>
  32.    
  33.   <div style="width:68%;float:right;">
  34.         <h2>酷站推荐   
  35.         <a href="javascript:void(0);" onclick="addRow()" >添加一行</a>  
  36.         
  37.         <a href="javascript:void(0);" onclick="startDrag()" >开始拖动</a>
  38.         </h2>
  39.        
  40.         <div id="item">
  41.        
  42.           <ul class="drop grid" id="g1">
  43.                 <li></li>
  44.                 <li></li>
  45.           </ul>
  46.    
  47.         </div>
  48.     </div>
  49.    
  50.     <div style="width:225px;float:left;">
  51.         <h2>已选中网站</h2>
  52.         <ul class="drag grid">
  53.             <li id="1"><div><img src="[url=http://img1.cache.netease.com/img09/logo/logo.gif]http://img1.cache.netease.com/img09/logo/logo.gif[/url]" alt="" width="175" height="50" title="" />网易</div>
  54.           </li>
  55.             <li id="2"><div><img src="[url=http://mat1.qq.com/www/iskin/skin4/expotclogo.gif]http://mat1.qq.com/www/iskin/skin4/expotclogo.gif[/url]" alt="" width="100" height="45" title="" />腾讯</div>
  56.           </li>
  57.             <li id="3"><div><img src="[url=http://i1.sinaimg.cn/home/deco/2009/0330/logo_home.gif]http://i1.sinaimg.cn/home/deco/2009/0330/logo_home.gif[/url]" alt="" title="" />新浪</div>
  58.           </li>
  59.             <li id="4"><div><img src="[url=http://www.google.cn/intl/zh-CN/images/logo_cn.gif]http://www.google.cn/intl/zh-CN/images/logo_cn.gif[/url]" alt="" title="" />谷歌</div>
  60.           </li>
  61.             <li id="5"><div><img src="[url=http://www.it86.cc/uploads/allimg/c090630/12463QO5220-1J360.jpg]http://www.it86.cc/uploads/allimg/c090630/12463QO5220-1J360.jpg[/url]" alt="" title="" />搜狐</div>
  62.           </li>
  63.             <li id="6"><div><img src="[url=http://www.baidu.com/img/baidu_logo.gif]http://www.baidu.com/img/baidu_logo.gif[/url]" alt="" title="" />百度</div>
  64.           </li>
  65.             <li id="7"><div><img src="[url=http://cn.yimg.com/hp/0910/img/yahoo_logo2.gif]http://cn.yimg.com/hp/0910/img/yahoo_logo2.gif[/url]" alt="" title="" />雅虎</div>
  66.           </li>
  67.             <li id="8">
  68.               <div><img src="[url=http://assets.taobaocdn.com/img/chl/fp/logo080808.png]http://assets.taobaocdn.com/img/chl/fp/logo080808.png[/url]" alt="" title="" />淘宝网</div>
  69.           </li>
  70.         </ul>
  71.     </div>
  72.  
  73.   </div>
  74.  
  75.  <script type="text/javascript">
  76.  var r=null;
  77.  window.onload=function()
  78.  {
  79.   r=document.getElementById('item').innerHTML;  
  80.  }
  81.  function addRow() {
  82.   var obj=document.getElementById('item')
  83.   obj.innerHTML=obj.innerHTML+r;
  84.  }
  85.  
  86.  
  87.  function startDrag()
  88.  {
  89.   //.drag li 里面的元素对应的放置位置是 .drop li, 完成后回调change函数,默认限制拖动范围是窗口内部
  90.   $('.drag li').Drag({drop:'.drop li,.drag li',finish:change});
  91.   //.drag li 里面的元素对应的放置位置是 .drop li和.drag li(自身), 完成后回调change函数,默认限制拖动范围是窗口内部
  92.   $('.drop li').Drag({drop:'.drop li, .drag li',finish:change});
  93.   //document.getElementById('ravl').value=document.getElementById('item').innerHTML;
  94.  }
  95.  <!--
  96.  //拖放插件DragDrop
  97.  $.fn.Drag=function (options) {
  98.   var defaults={
  99.    limit : window,//是否限制拖放范围,默认限制当前窗口内
  100.    drop:false,//是否drop
  101.    handle:false,//拖动手柄
  102.    finish:function () {}//回调函数
  103.   };
  104.   var options=$.extend(defaults,options);
  105.   this.X=0;//初始位置
  106.   this.Y=0;
  107.   this.dx=0;//位置差值
  108.   this.dy=0;
  109.   var This=this;
  110.   var ThisO=$(this);//被拖目标
  111.   var thatO;
  112.   if (options.drop) {
  113.    var ThatO=$(options.drop);//可放下位置
  114.    ThisO.find('div').css({cursor:'move'});
  115.    var tempBox=$('<div id="tempBox" class="grid"></div>');
  116.   }else {
  117.    options.handle ? ThisO.find(options.handle).css({cursor:'move','-moz-user-select':'none'}) : ThisO.css({cursor:'move','-moz-user-select':'none'});
  118.   }
  119.   //拖动开始
  120.   this.dragStart=function (e) {
  121.    var cX=e.pageX;
  122.    var cY=e.pageY;
  123.    if (options.drop) {
  124.     ThisO=$(this);
  125.     if (ThisO.find('div').length!=1) {return}//如果没有拖动对象就返回
  126.     This.X=ThisO.find('div').offset().left;
  127.     This.Y=ThisO.find('div').offset().top;
  128.     tempBox.html(ThisO.html());
  129.     ThisO.html('');
  130.     $('body').append(tempBox);
  131.     tempBox.css({left:This.X,top:This.Y});
  132.    }else {
  133.     This.X=ThisO.offset().left;
  134.     This.Y=ThisO.offset().top;
  135.     ThisO.css({margin:0})
  136.    }
  137.    This.dx=cX-This.X;
  138.    This.dy=cY-This.Y;
  139.    if (!options.drop) {ThisO.css({position:'absolute',left:This.X,top:This.Y})}
  140.    $(document).mousemove(This.dragMove);
  141.    $(document).mouseup(This.dragStop);
  142.    if ($.browser.msie) {ThisO[0].setCapture();}//IE,鼠标移到窗口外面也能释放
  143.   }
  144.   //拖动中
  145.   this.dragMove=function (e) {
  146.    var cX=e.pageX;
  147.    var cY=e.pageY;
  148.    if (options.limit) {//限制拖动范围
  149.     
  150.     //容器的尺寸
  151.     var L=$(options.limit)[0].offsetLeft ? $(options.limit).offset().left : 0;
  152.     var T=$(options.limit)[0].offsetTop ? $(options.limit).offset().top : 0;
  153.     var R=L+$(options.limit).width();
  154.     var B=T+$(options.limit).height();
  155.     //获取拖动范围
  156.     var iLeft=cX-This.dx, iTop=cY-This.dy;
  157.     //获取超出长度
  158.     var iRight=iLeft+parseInt(ThisO.innerWidth())-R, iBottom=iTop+parseInt(ThisO.innerHeight())-B;
  159.     //alert($(window).height())
  160.     //先设置右下, 再设置左上
  161.     if(iRight > 0) iLeft -= iRight;
  162.      
  163.     if(iBottom > 0) iTop -= iBottom;
  164.     if(L > iLeft) iLeft = L;
  165.     if(T > iTop) iTop = T;
  166.     if (options.drop) {
  167.      tempBox.css({left:iLeft,top:iTop})
  168.     }else {
  169.      ThisO.css({left : iLeft,top : iTop})
  170.     }
  171.    }else {
  172.     //不限制范围
  173.     if (options.drop) {
  174.      tempBox.css({left:cX-This.dx,top:cY-This.dy})
  175.     }else {
  176.      ThisO.css({left:cX-This.dx,top:cY-This.dy});
  177.     }
  178.    }
  179.    
  180.   }
  181.   //拖动结束
  182.   this.dragStop=function (e) {
  183.    if (options.drop) {
  184.     var flag=false;
  185.     var cX=e.pageX;
  186.     var cY=e.pageY;
  187.     var oLf=ThisO.offset().left;
  188.     
  189.     var oRt=oLf+ThisO.width();
  190.     var oTp=ThisO.offset().top;
  191.     var oBt=oTp+ThisO.height();
  192.     if (!(cX>oLf && cX<oRt && cY>oTp && cY<oBt)) {//如果不是在原位
  193.      for (var i=0; i<ThatO.length; i++) {
  194.       var XL=$(ThatO[i]).offset().left;
  195.       var XR=XL+$(ThatO[i]).width();
  196.       var YL=$(ThatO[i]).offset().top;
  197.       var YR=YL+$(ThatO[i]).height();
  198.       if (XL<cX && cX<XR && YL<cY && cY<YR) {//找到拖放目标 交换位置
  199.        var newElm=$(ThatO[i]).html();
  200.        $(ThatO[i]).html(tempBox.html());
  201.        ThisO.html(newElm);
  202.        thatO=$(ThatO[i]);
  203.        tempBox.remove();
  204.        flag=true;
  205.        break;//一旦找到 就终止循环
  206.       }
  207.      }
  208.     }
  209.     if (!flag) {//如果找不到拖放位置,归回原位
  210.      tempBox.css({left:This.X,top:This.Y});
  211.      ThisO.html(tempBox.html());
  212.      tempBox.remove();
  213.     }
  214.    }
  215.    $(document).unbind('mousemove');
  216.    $(document).unbind('mouseup');
  217.    options.finish(e,ThisO,thatO);
  218.    if ($.browser.msie) {ThisO[0].releaseCapture();}
  219.   }
  220.   //绑定拖动
  221.   options.handle ? ThisO.find(options.handle).mousedown(This.dragStart) : ThisO.mousedown(This.dragStart);
  222.   
  223.   //IE禁止选中文本
  224.   //document.body.onselectstart=function(){return false;}
  225.  }
  226.  //下面是例子
  227.  //.drag li 里面的元素对应的放置位置是 .drop li, 完成后回调change函数,默认限制拖动范围是窗口内部
  228.  //$('.drag li').Drag({drop:'.drop li',finish:change});
  229.  //.drag li 里面的元素对应的放置位置是 .drop li和.drag li(自身), 完成后回调change函数,默认限制拖动范围是窗口内部
  230.  //$('.drop li').Drag({drop:'.drop li, .drag li',finish:change});
  231.  //$('#test').Drag({handle:'h2',finish:change});//不限制拖动范围 可设置limit:false
  232.  var change=function (e,oldElm,newElm) {
  233.   //alert(newElm)
  234.  }
  235.  //-->
  236.  </script>
  237. </body>
  238. </html>

作者: ssttm169   发布时间: 2009-11-19

相关阅读 更多