jQuery拖放节点

来源:互联网 发布:自学程序员的步骤 编辑:程序博客网 时间:2024/06/03 16:19

$(document).ready(function(){
drag.init();
})

//拖拽

var drag = {
permitDrag : false,//是否允许移动标识
_x : 0,             //临时节点x坐标
    _y : 0,    //节点y坐标
    _left : 0,          //光标与节点坐标的距离
    _top : 0,           //光标与节点坐标的距离
    old_elm : null,     //拖拽原节点
    old_elm_left:0,     //原节点坐标
    old_elm_top:0,
    old_elm_clone:null, //克隆原节点
    tmp_elm : null,     //跟随光标移动的临时节点
    parent_elm:null,     //拖拽原节点的父元素
    down_parent_pro:0,  //拖拽节点父元素属性
    up_parent_pro:0,    
    surplus_num:0,      //模块数量
    containerTop:0,     //中心区域到顶部距离
    isMove:false,       //是否移动了模块
    old_elm_width:0,    //原节点的宽度
    old_elm_height:0,   //原节点的高度
    isPut:false,         //判断模块是否放在指定区域

    //初始化
    init : function (){
        drag.surplus_num=Number($('#surplus').text());
        drag.containerTop=$('.container').offset().top;

        //监听鼠标按下事件,动态绑定要拖拽的节点(因为节点可能是动态添加的)
        $('.container').on('mousedown', '.dragger', function(event){
            //当在允许拖拽的节点上监听到点击事件,将标识设置为可以拖拽
            drag.permitDrag = true;
            //获取到拖拽的原节点对象
            drag.old_elm = $(this);
            //执行开始拖拽的操作
            drag.mousedown(event);
            return false;
        });

        //监听鼠标移动
        $(document).mousemove(function(event){
            //判断拖拽标识是否为允许,否则不进行操作
            if(!drag.permitDrag) return false;
            //执行移动的操作
            drag.mousemove(event);
            return false;
        });

        //监听鼠标放开
        $(document).mouseup(function(event){
            //判断拖拽标识是否为允许,否则不进行操作
            if(!drag.permitDrag) return false;
            //拖拽结束后恢复标识到初始状态
            drag.permitDrag = false;
            //执行拖拽结束后的操作
            drag.mouseup(event);
            return false;
        });

    },

//按下鼠标 执行的操作
mousedown : function (event){
         drag.isMove=false; //元素未移动
         drag.isPut=false;  //重置模块位置判断      

        //克隆临时节点,跟随鼠标进行移动
        drag.tmp_elm = $(drag.old_elm).clone();

        //计算节点和光标的坐标
        drag._x = $(drag.old_elm).offset().left;
        drag._y = $(drag.old_elm).offset().top-drag.containerTop;

        var e = event || window.event;
        drag._left = e.pageX - drag._x;
        drag._top = e.pageY - drag._y;

        // 原节点宽高
        drag.old_elm_width=$(drag.old_elm).outerWidth();
        drag.old_elm_height=$(drag.old_elm).outerHeight();

        //修改克隆节点的坐标,实现跟随鼠标进行移动的效果
        $(drag.tmp_elm).css({
        'position' : 'absolute',
        'left' : drag._x,
        'top' : drag._y,
            'margin':'0', 
            'paddingLeft':'0',          
            'paddingRight':'0',          
            'width':drag.old_elm_width,           
            'height':drag.old_elm_height
        });

        //添加临时节点
        tmp = $(drag.old_elm).parent().append(drag.tmp_elm);   
        drag.tmp_elm = $(tmp).find(drag.tmp_elm);

        // 获取原节点坐标和克隆
        drag.old_elm_left=drag.old_elm.parent().offset().left;
        drag.old_elm_top=drag.old_elm.parent().offset().top;  
        drag.parent_elm=$(drag.old_elm).parent(); 
        drag.down_parent_pro=drag.parent_elm.attr('data-num');       
    },

//移动鼠标 执行的操作
mousemove : function (event){
        drag.isMove=true;   //元素移动了
        drag.old_elm_clone=$(drag.old_elm).clone();    //克隆原节点
        $(drag.old_elm).remove(); //移除原节点

        //计算坐标
        var e = event || window.event;
        var x = e.pageX - drag._left;
        var y = e.pageY - drag._top;
        var maxL = $('.container').width() - drag.old_elm_width;
        var maxT = $('.container').height() - drag.old_elm_height;

        //不允许超出浏览器范围
        x = x < 0 ? 0: x;
        x = x > maxL ? maxL: x;
        y = y < 0 ? 0: y;
        y = y > maxT ? maxT: y;

        //修改克隆节点的坐标
        $(drag.tmp_elm).css({
        'left' : x,
        'top' : y,
        });  
    },

    //放开鼠标 执行的操作
    mouseup : function (event){
        //移除临时节点
        $(drag.tmp_elm).remove();        
        if(drag.isMove==true){
        //判断所在区域是否允许放置节点
        var e = event || window.event;

        $.each($('.drapBox','.container'), function(index, value){
            //获取容器的坐标范围 (区域)
            var box_x = $(value).offset().left;     //容器左上角x坐标
            var box_y = $(value).offset().top;      //容器左上角y坐标
            var box_width = $(value).outerWidth();  //容器宽
            var box_height = $(value).outerHeight();//容器高
            
            //判断放开鼠标位置是否想允许放置的容器范围内
            if(e.pageX > box_x && e.pageX < box_x-0+box_width && e.pageY > box_y && e.pageY < box_y-0+box_height){
                    //向目标容器添加节点 
                    if($('.container-center').find($(value)).children().length<1){                        
                        $(value).append(drag.old_elm_clone);
                    }else{
                        $(drag.parent_elm).append(drag.old_elm_clone);                     
                    }
                    drag.isPut=true;    //在指定位置放置了元素
                }
            });

        // 判断鼠标指针超出指定范围        
        if(drag.isPut==false){
            $(drag.parent_elm).append(drag.old_elm_clone);
        }

        if (self != top) { 
            //判断鼠标在iframe外部松开
            (window.parent.document).on('mouseup', function () { 
                $(drag.parent_elm).append(drag.old_elm_clone);
                $(drag.tmp_elm).remove();
            });
        }

  // 获取父元素的属性
  drag.up_parent_pro=$(drag.old_elm_clone).parent().attr('data-num');


  if(drag.up_parent_pro=='1'){
            sortModule(); //排序 
        }

        // 模块数量加减
        if(drag.down_parent_pro==1&&drag.up_parent_pro!=1){
            drag.surplus_num-=1;
            $('#surplus').text(drag.surplus_num);
        }else if(drag.down_parent_pro!=1&&drag.up_parent_pro==1){
          drag.surplus_num+=1;
          $('#surplus').text(drag.surplus_num);
      }
  }
}
};
原创粉丝点击