$(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);
}
}
}
};