扩展了 jquery 的插件 easy drag (转载 木野狐)

扩展了 jquery 的插件 easy drag

jquery 实现拖动的插件,试了几个,interface 是一个,但是 bug 太多,代码又复杂不好修改,就放弃了。
今天找到了一个叫做 easydrag 的,但用了下也不灵活,于是扩充了一下,现在可以指定拖动的 handle.

jquery.easydrag.js(以下 绿色部分是我增加或修改的代码):

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> /* *
* EasyDrag 1.3 - Drag & Drop jQuery Plug-in
*
* For usage instructions please visit http://fromvega.com
*
* Copyright (c) 2007 fromvega
*/

(
function ($){

    
//  to track if the mouse button is pressed
     var  isMouseDown     =   false ;

    
//  to track the current element being dragged
     var  currentElement  =   null ;

    
//  callback holders
     var  dropCallbacks  =  {};
    
var  dragCallbacks  =  {};

    
//  global position records
     var  lastMouseX;
    
var  lastMouseY;
    
var  lastElemTop;
    
var  lastElemLeft;

    
//  returns the mouse (cursor) current position
    $.getMousePosition  =   function (e){
        
var  posx  =   0 ;
        
var  posy  =   0 ;

        
if  ( ! e)  var  e  =  window.event;

        
if  (e.pageX  ||  e.pageY) {
            posx 
=  e.pageX;
            posy 
=  e.pageY;
        }
        
else   if  (e.clientX  ||  e.clientY) {
            posx 
=  e.clientX  +  document.body.scrollLeft  +  document.documentElement.scrollLeft;
            posy 
=  e.clientY  +  document.body.scrollTop   +  document.documentElement.scrollTop;
        }

        
return  { 'x': posx, 'y': posy };
    }

    
//  updates the position of the current element being dragged
    $.updatePosition  =   function (e) {
        
var  pos  =  $.getMousePosition(e);

        
var  spanX  =  (pos.x  -  lastMouseX);
        
var  spanY  =  (pos.y  -  lastMouseY);

        $(currentElement).css(
" top " ,  (lastElemTop  +  spanY));
        $(currentElement).css(
" left " , (lastElemLeft  +  spanX));
    }

    
//  when the mouse is moved while the mouse button is pressed
    $(document).mousemove( function (e){
        
if (isMouseDown){
            
//  update the position and call the registered function
            $.updatePosition(e);
            
if (dragCallbacks[currentElement.id]  !=  undefined){
                dragCallbacks[currentElement.id](e);
            }

            
return   false ;
        }
    });

    
//  when the mouse button is released
    $(document).mouseup( function (e){
        
if (isMouseDown){
            isMouseDown 
=   false ;
            
if (dropCallbacks[currentElement.id]  !=  undefined){
                dropCallbacks[currentElement.id](e);
            }
            
return   false ;
        }
    });

    
//  register the function to be called while an element is being dragged
    $.fn.ondrag  =   function (callback){
        
return   this .each( function (){
            dragCallbacks[
this .id]  =  callback;
        });
    }

    
//  register the function to be called when an element is dropped
    $.fn.ondrop  =   function (callback){
        
return   this .each( function (){
            dropCallbacks[
this .id]  =  callback;
        });
    }

    
//  set an element as draggable - allowBubbling enables/disables event bubbling
    $.fn.easydrag  =   function (allowBubbling, handle_ids){

        
return   this .each( function (){

            
//  if no id is defined assign a unique one
             if (undefined  ==   this .id)  this .id  =  'easydrag' + time();

            
if  (handle_ids) {
                
// 修改鼠标光标为移动的形状

                for (var i=0; i<handle_ids.length; i++ ) {
                    $(
"#" + handle_ids[i]).css("cursor""move"
);
                }
            } 
else
 {
                $(
this).css("cursor""move"
);
            }
            
            
//  when an element receives a mouse press
            $( this ).mousedown( function (e){
                
if  (handle_ids) {
                    
// 判断是否是在拖动某个 handle

                    var  srcElement;
                    
if
 (e)
                        srcElement 
=
 e.srcElement;
                    
else

                        srcElement 
=  window.event.srcElement;
                    
                    
var exists = false
;
                    
if (srcElement.id !=
 undefined) {
                        
for (var i=0; i<handle_ids.length; i++
) {
                            
if (handle_ids[i] ==
 srcElement.id) {
                                exists 
= true
;
                                
break
;
                            }
                        }
                    }
                    
if (!
exists)
                        
return false
;
                }
                
//  set it as absolute positioned
                $( this ).css( " position " " absolute " );

                
//  set z-index
                $( this ).css( " z-index " " 10000 " );

                
//  update track variables
                isMouseDown     =   true ;
                currentElement 
=   this ;

                
//  retrieve positioning properties
                 var  pos     =  $.getMousePosition(e);
                lastMouseX 
=  pos.x;
                lastMouseY 
=  pos.y;

                lastElemTop  
=   this .offsetTop;
                lastElemLeft 
=   this .offsetLeft;

                $.updatePosition(e);

                
return  allowBubbling  ?   true  :  false ;
            });
        });
    }

})(jQuery);

调用代码:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->     win.easydrag( false , ['oDragHandle_'  +  id]);
 
    
//  自定义的拖放后处理,记录目标移动到的新位置
    win.ondrop( function (){
        
//  save position info
        notesData[id].x  =  parseInt(win.css( " left " ));
        notesData[id].y 
=  parseInt(win.css( " top " ));
    });

转载地址:http://www.cnblogs.com/RChen/archive/2007/09/20/easydrag.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用法: $(“#box”).easydrag();//给指定的标签绑定拖动效果,也可以是Class $(“#box”).setHandler(‘handler’);//指定触发拖动的元素,download best apps for iphone 5handler是该元素的idhttp://www.newipadipa.com/ ,后面我们需要修改它 首先这个插件真的很好用(废话),短短2行代码就能让页面中的div动起来。但是如果要拖动很多div的时候 ,我们还是要稍微做出修改才能正常使用。 首先我的弹窗div在弹出的时候是默认在页面正中的,但是要使用这个插件被拖动的div就要使 用”position:absolute”的属性定位,这让我们的居中非常困难。解决思路:在触发弹窗之前用js获取当前屏 幕的分辨率然后将div居中。 js代码: { var div_width=Number(jQuery(‘#box’).css(‘width’)); var sc_width=(Number(window.screen.width)/2-(div_width/2)); //div距离浏览器左边框的距离为屏幕宽 度的一半-div宽度的一半 jQuery(‘#box).css(‘left’,sc_width); } 好了,初始化之后就是拖动了,如果需要拖动的div不多的话这样就可以了。但是我写的页面要拖动的div较多 ,而且这个插件只能用id号给元素绑定触发拖动的属性,如果一个id一个id的绑定事件的话会造成代码冗余 。所以我们要修改一下源文件jquery.easydrag.handler.beta2.js:找到 function(handlerId) 这个函数, 将里面的$(“#”+handlerId)都改成$(“.”+handlerId)就可以了。好吧,这样就可以了,下面是实例,高手们请 无视好了。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值