/* 此处的命名空间和U.DD.js相同 因为功能是属于一个模块下的 */ //#region 拖动区域 Namespace.register("U.D"); //#region 带虚拟框的拖动 /* * 拖动函数处理 * * @param {element} 需要拖动的元素 * @param {function} 拖动回调函数 * @param {object} 拖动参数 ----------参数为GetElementInfo 返回值 * @return {object} 拖动对象 */ U.D.DragMouseDown = function (UDOD, UCB, UDE) { if (event.button < 2) { //判断左键使用 var _UTE = new U.D.DragMouseDown.init(UDOD, UCB, UDE), _UKE = {//拖动事件处理 "mousemove": U.M.apply(_UTE, _UTE.Drag), //move事件处理 "mouseup": U.M.apply(_UTE, _UTE.DragUp) //up事件处理 }; //绑定事件 U.Ut.AddObj(_UTE, _UKE); //给拖动方法添加新的事件。 _UTE.create(); //创建拖动参数 $(document).bind(_UKE); //绑定拖动事件 //返回对象 return (U.D.DragMouseDown.ST = _UTE); } } /* * 初始化拖动等待拖动 * * @param {element} 需要拖动的元素 * @param {function} 拉伸回调函数 * @param {object} 拖动参数 * @param {object} 拉伸回调函数 ----------参数为GetElementInfo 返回值 */ U.D.DragMouseDown.init = function (UDOD, UCB, UDE, UCE) { (UCE && UCE.start) && (UCE.start()); //初始化回调 this.set(UCE); //参数设置和说明 this.set({ max: (UDE && UDE.MaxLeft) ? UDE : null, //最大的拖动范围 SO: UDOD, //拖动的元素 AF: UCB, //回调函数 ESO: event.srcElement //当前选中的元素 }); return this; } U.D.DragMouseDown.init.prototype = { /* * 设置拖动参数 上述有参数说明 * * @param {object} 需要拖动的元素 */ set: function (UDE) { (UDE) && (U.Ut.AddObj(this, UDE)); }, /* * 创建虚拟框 * */ create: function () { var _UDOD = this.SO, //拖动元素 _UHE = U.M.GetElementAllInfo(_UDOD); //拖动元素的位置 //参数设置 U.Ut.AddObj(this, { IsD: false, //是否为有效拖动 XY: U.M.GetMousep(), //当前鼠标位置 E: _UHE, //拖动元素大小等 MaxTop: _UHE["PXT"] + US.Height - 10, //最大拖动top MaxLeft: _UHE["PXL"] + US.Width, //最大拖动left MinLeft: -_UHE["OW"] + 10, //最小拖动left MinTop: 0 //最小拖动top }); //判断是否有最大范围设置 (this.max) && (this.IsMinAndMax()); }, /* * 限制拖动范围 * * @param {object} 需要拖动的元素 */ IsMinAndMax: function (UDE) { U.Ut.AddObj(this, { "MaxLeft": this.E["PXL"] + UDE["MaxLeft"] || this.MaxLeft, //最大拖动left "MinLeft": UDE["MinLeft"] || this.MinLeft, //最小拖动left "MinTop": UDE["MinTop"] || this.MinTop, //最小拖动top "MaxTop": this.E["PXT"] + UDE["MaxTop"] || this.MaxTop //最大拖动top }); //设置拉伸的范围限制 }, //拖动时触发的函数 Drag: function () { var i, _UHE, _UDTD, _UDMD, _UDOD = this.SO, //拖动元素 _UDE = [["X", "Left", "L"], ["Y", "Top", "T"]], //设置参数 _UME = this.E, //拖动元素原大小位置 _UCE = this.XY, _UE = U.M.GetMousep(); //鼠标的位置 (this.move) && (this.move(this)); //回调函数 //循环判断设置 top left for (i = 0; i < _UDE.length; i++) { _UDE[i] = Math.min(Math.max(_UE[(_UHE = _UDE[i])[0]] - _UCE[_UHE[0]] + _UME["O" + _UHE[2]], this["Min" + _UHE[1]]), this["Max" + _UHE[1]]); } //第一次拖动的参数 if (!this.IsD) { this.IsD = true; //设置正在拖动 U.Ut.AddObj(this, { VDB: U.D.foundVirtualBox(_UDOD), //添加虚拟框 UMD: U.D.Masklayer() //添加遮层 }); //绑定事件 $(this.UMD).bind({ mousemove: this.mousemove, //移动事件绑定 mouseup: this.mouseup //释放事件 }); //遮罩置顶 U.D.SetDTop(this.UMD); U.D.SetDTop(this.VDB); //鼠标聚焦处理 this.VDB.setCapture(); } //鼠标处理 $(this.VDB).addAttrArray({ "style": { "cssText": "left:" + _UDE[0] + "px;top:" + _UDE[1] + "px;"} }); }, //拖动结束 DragUp: function () { //事件释放 $[document, this.UMD].unbind( { "mousemove": this.mousemove, //拖动变化使用 "mouseup": this.mouseup //拖动结束 }); this.IsD = false; //设置结束 //释放元素 同时元素定位 if (this.VDB) { var _UDMD = this.UMD, //遮罩框 _UDTD = this.VDB, //虚拟框 _UDE = U.M.GetElementInfo(_UDTD); //拖动结束的位置 _UDTD.releaseCapture(); U.D.DragMouseDown.chche = U.D.DragMouseDown.ST = null; $[_UDMD, this.VDB].remove(); //元素移除 //事件结束 $(this.SO).addAttrArray({ "style": { "cssText": "top:" + (_UDE["OT"] + 2) + "px;left:" + (_UDE["OL"] + 2) + "px;"} }); U.D.withf(this.UCB); //执行回调 } } } //#endregion //#region /* * 直接拖动元素不带虚拟框 一般常用于图标移动 * * @param {element} 需要拖动的元素 * @param {object} 拖动参数 ----------[ST] 初始化回调函数 * @return {object} 拖动对象 */ U.D.iconmove = function (UDOD, UDE) { if (event.button != 2) { //只有右键允许拖动 var _UTE = new U.D.iconmove.init(UDOD, UDE); return _UTE; } } U.D.iconmove.init = function (UDOD, UDE) { //拖动开始 if (UDOD) { var i, _UE = U.M.GetElementAllInfo($(UDOD)[0]), //拖动元素的位置 _UKE = U.M.GetMousep(), //鼠标位置 _UCE = this.UCE = { "mousemove": U.M.apply(this, this.move), //移动函数处理 "mouseup": U.M.apply(this, this.up) //释放函数处理 }; (UDE && UDE["ST"]) && (UDE["ST"].call(this, UDOD)); //初始化回调 //初始化参数 U.Ut.AddObj(this, { IsD: false, //设置未拖动状态 // UMD: U.D.Masklayer(), //虚拟框 E: _UKE, //鼠标位置 SO: UDOD, //拖动元素 UE: _UE, //元素的位置 UCF: UDE, //拖动传参 MT: _UE["PXT"] + US.Height - 10, //拖动最大top ML: _UE["PXL"] + US.Width, MIL: -_UE["OW"] + 10, //拖动最大left MIT: 0 //最小拖动范围 }); //绑定设置 UDOD.setCapture(); //事件聚焦 $(document).bind(_UCE); //事件绑定 U.D.SetDTop(this.UMD, true); //置顶 $(UDOD).css("z-index", 9999); //当前拖动元素置顶 return this; } } U.D.iconmove.init.prototype = { //移动效果 move: function () { var i, _UTL, _UDOD = this.SO; //当前拖动元素处理 _UE = U.M.GetMousep(), //当前拖动鼠标位置 _UKE = this.E, //初始鼠标位置 _UME = this.UE, //元素位置 _UAE = [["X", "L"], ["Y", "T"]]; //变化top left对应参数 U.M.StopBubble(); //阻止冒泡 if (!this.UMD) { this.UMD = U.D.Masklayer(); $(this.UMD).bind(this.UCE); //事件绑定 } //计算获取位置 for (i = 0; i < _UAE.length; i++) { _UTL = _UE[_UAE[i][0]] - _UKE[_UAE[i][0]]; (Math.abs(_UTL) > 2) && (this.IsD = true); _UAE[i] = Math.min(Math.max(_UTL + _UME["O" + _UAE[i][1]], this["MI" + _UAE[i][1]]), this["M" + _UAE[i][1]]); } //设置值 $(_UDOD).addAttrArray({ "style": { "cssText": "left:" + _UAE[0] + "px;top:" + _UAE[1] + "px"} }); //? (this.UCF && this.UCF["Move"]) && (this.UCF["Move"].apply(this, [_UDOD, _UAE, _UKE, _UE])); //回调 this.ism = true; }, //移动结束 up: function () { var _UDOD = this.SO, //拖动元素 _UFE = this.UCF; //回调函数 U.M.StopBubble(); //阻止冒泡 _UDOD.setCapture(); //事件聚焦 //释放 this.ism = null; $(this.UMD).remove(); //虚拟框移除 $(document).unbind(this.UCE); //移除绑定 $(_UDOD).css("z-index", ""); //去除置顶 // //回调 (_UFE && _UFE["UP"]) && (_UFE["UP"].apply(this, [_UDOD])); //回调函数处理 setTimeout(function () { _UDOD.releaseCapture() }, 0); ; //鼠标聚焦移除 } } //#endregion //#region 拖动选择区域 /* * 直接拖动元素不带虚拟框 一般常用于图标移动 * * @param {object} 拖动参数 */ U.D.DragSelectE = function (UDE) { if (event.button != 2) { var _UTE, _UCE, _UKE, _UDOD = UDE["SO"], //拖选区域的元素 _UE = U.M.GetMousep(), //获取当前鼠标的位置 _UTF = _UDOD.componentFromPoint(_UE["X"] + 2, _UE["Y"] + 2); //在滚动条内允许使用 if (_UTF != "outside" && _UTF.indexOf("scroll") == -1) { _UTE = (new U.D.DragSelectE.init(UDE)).create().SetHover().event(); return _UTE; } } else { //右键处理 (U.D.DragE) && (U.D.DragE.SetHover()); } } /* * 拖动开始区域 * * @param {object} 拖动参数 */ U.D.DragSelectE.init = function (UDE) { var _UDOD = UDE["SO"], _UDTD = UDE["SSO"] || _UDOD, _USC = UDE["CS"]; //拖动参数添加 U.Ut.AddObj(this, { "EL": _UDOD, "SSO": _UDTD, "OS": _UDTD.onscroll, "CB": _UDOD.onmousedown, "CS": _USC, "PEL": U.M.GetStyle(_UDOD, "position") != "static" ? _UDOD : U.M.TOSP(_UDOD), "TC": [], "Fun": UDE["FUN"], "ElO": "", "ESO": "", "UT": "", "UL": "", "UW": "", "UH": "", "X": "", "Y": "", "TX": "", "TY": "", "PUX": "", "PUY": "", "W": "", "H": "", "T": "", "L": "" }); } U.D.DragSelectE.init.prototype = { event: function (UTF) { //事件赋值 var i, j, k, z, _USH, _UKE, //拖选处理 绑定4个时间 mousedown mousemove mouseup scroll _UCE = this.e = this.e || [[document, { "mousemove": ["Drag"], "mouseup": ["DragUp"]}], [this.SSO, { "scroll": ["CTA", "Drag"]}], [this["EL"], { "mousedown": ["Event"]}]]; //拖选处理 for (i = 0; i < _UCE.length; i++) { _UKE = _UCE[i]; (!U.Ut.isArray(_UKE[0])) && (_UKE[0] = [_UKE[0]]); //绑定事件处理 for (j in _UKE[1]) { if (_UKE[1].hasOwnProperty(j)) { for (k = 0; k < _UKE[1][j].length; k++) { //绑定解除 (U.Ut.isString(_UKE[1][j][k])) && (_UKE[1][j][k] = U.M.apply(this, [[this[_UKE[1][j][k]]]])); //设置函数 for (z = 0; z < _UKE[0].length; z++) { $(_UKE[0][z])[(UTF ? "un" : "") + "bind"](j, _UKE[1][j][k]); } } } } } }, //变化赋值 CTA: function () { var _UXE = this.ElO = U.M.GetElementAllInfo(this.EL), //元素位置大小 //设置元素的位置 _UAE = { "PUX": this["PUX"], "PUY": this["PUY"] }; //元素位置设置 U.Ut.AddObj(this, { "PUX": _UXE["SL"] + _UXE["PXL"], "PUY": _UXE["ST"] + _UXE["PXT"] }); if (_UAE["PUX"] !== "") { this.DBH({ "UW": this.UW + (this["PUX"] - _UAE["PUX"]), "UH": this.UH + (this["PUY"] - _UAE["PUY"]), "UT": this.UT, "UL": this.UL }); } return _UXE; }, //创建托选 create: function () { var i, _UKE, _UDTD, _UDOD = this.EL, //拖动的元素 _UE = U.M.GetMousep(), //鼠标位置 _UXE = this.CTA(); //获取大小和变量 /* 设置大小位置 C:拖选下的志愿时 TX:left TY:top */ U.Ut.AddObj(this, { "C": $(_UDOD).Child(), "TX": _UXE.TX, "TY": _UXE.TY, "X": _UE.X - _UXE.TX + this["PUX"], "Y": _UE.Y - _UXE.TY + this["PUY"] }); //允许拖选使用 if ((_UDTD = this.C[0])) { _UKE = ["Left", "Top", "Right", "Bottom"]; for (i = 0; i < _UKE.length; i++) { _UKE[i] = U.M.GetStyle(_UDTD, "margin" + _UKE[i]); _UKE[i] = (!_UKE[i] || _UKE[i] == "auto") ? 0 : parseInt(_UKE[i]); } /* 参数设置: W:拖选长 H:拖选宽 T:拖动的高度 L:拖动的left */ U.Ut.AddObj(this, { "W": _UDTD.offsetWidth + _UKE[0] + _UKE[2], "H": _UDTD.offsetHeight + _UKE[1] + _UKE[3], "T": _UKE[1] + _UKE[3], "L": _UKE[0] + _UKE[2] }); } //拖动元素 this.ESO = $$("div", { "className": "UD_DSE", "style": { "cssText": "top:" + this.Y + "px;left:" + this.X + "px;zIndex:" + US.ZV + 1} }, _UDOD); return this; }, Drag: function () {//拖动选择逻辑 var _UDOD = this.EL, _UE = U.M.GetMousep(), //当前鼠标的位置获取 _UT = Math.min(Math.max(_UE["Y"] - this.TY + this["PUY"], 0), Math.max(this.ElO["SH"], this.ElO["OH"]) - 2), //top _UL = Math.min(Math.max(_UE["X"] - this.TX + this["PUX"], 0), this.ElO["SW"] - 2), //left _UW = _UL - this.X, //选择的长 _UH = _UT - this.Y; //选择的框 //设置拖动最大最小的范围 if (_UW < 0) { _UW = Math.abs(_UW); } else { _UL = this.X; } if (_UH < 0) { _UH = Math.abs(_UH); } else { _UT = this.Y; } //设置位置和大小 this.DBH({ "UW": _UW, "UH": _UH, "UT": _UT, "UL": _UL }); //设置大小位置 }, /* * 滚动大小变化设置 * * @param {object} 选择的范围 */ DBH: function (UDE) { var _UE = {}; $(this.ESO).addAttrArray({ "style": { "cssText": "width:" + UDE.UW + "px;height:" + UDE.UH + "px;top:" + UDE.UT + "px;left:" + UDE.UL + "px;"} }); //拉动大小变化 U.Ut.AddObj(this, UDE); //添加属性处理 //位置大小设置 U.Ut.AddObj(_UE, { "X": UDE.UL, "Y": UDE.UT, "BX": UDE.UW + UDE.UL, "BY": UDE.UH + UDE.UT }); this.IsLocation(_UE); //位置大小设置 }, /* * 选择元素逻辑范围逻辑 * * @param {object} 选择的范围 */ IsLocation: function (UDE) { if (this.C[0]) {//有子元素 var i, _UKE, _UDTD, _UTF, _ULE = this.GetLXY(UDE); //选择的元素 //去除样式 if (this.TC.length) { for (i = 0; i < this.TC.length; i++) { $(_UDTD).removeClass(this.CS); } } //重新生成选择元素 this.TC = []; for (i = _ULE[0]; i < _ULE[1]; i++) {//生成 if ((_UDTD = this.C[i])) { //计算范围进行判断是否需要选择钙元素 _UTF = ((_UKE = i % _ULE[4]) >= _ULE[2]) && (_UKE <= _ULE[3]) && ((_UKE + 1) * this.W >= UDE["X"]); if (_UTF && (_UDTD.offsetTop > UDE["BY"] || (_UDTD.offsetTop + this.H - this.T < UDE.Y))) { _UTF = false; } $(_UDTD)[(_UTF ? "add" : "remove") + "Class"](this.CS); //去除css (_UTF) && (this.TC.push(_UDTD)); } } U.D.DragE = this; } }, /* * 获取元素选择范围 * * @param {object} 选择的范围 */ GetLXY: function (ULE) {// var _UL, _UDE = [0, 0]; _UDE[4] = _UL = Math.floor(this.ElO["SW"] / this.W); //每行占位的个数 _UDE[0] = ((Math.floor(ULE["Y"] / this.H) - 1) * _UL); //开始的位置 _UDE[1] = _UDE[0] + ((Math.ceil((ULE["BY"]) / this.H) - Math.floor(_UDE[0] / _UL)) * _UL); //结束的位置 _UDE[2] = Math.min(Math.ceil(ULE["X"] / this.W), _UL) - 1; _UDE[3] = Math.min(Math.ceil(ULE["BX"] / this.W), _UL) - 1; return _UDE; }, //左右键逻辑 Event: function () { if (event.button == 2) { var i, _UHT, _UHL, _UTF, _UDCD = this.TC, _UE = U.M.GetMousep(), //鼠标位置 _UT = _UE["Y"] - this.TY + this["PUY"], //鼠标在滚动掉的top _UL = _UE["X"] - this.TX + this["PUX"]; //鼠标在滚动掉的left //计算范围 for (i = 0; i < _UDCD.length; i++) { if (((_UHT = _UDCD[i].offsetTop) <= _UT && (_UHT + this.H - this.T) >= _UT) && ((_UHL = _UDCD[i].offsetLeft) <= _UL && (_UHL + this.W) > _UL)) { _UTF = true; } } //如果是需要回调的元素 if (_UTF) { (this.Fun) && (this.Fun(this.TC)); } return !_UTF; //回调使用 } }, //结束的逻辑 DragUp: function () { var _UDOD = this.EL; this.event(true); _UDOD.releaseCapture(); _UDOD.removeChild(this.ESO); //去除事件 }, //释放变化 SetHover: function () { var _UTE = U.D.DragE || this; (_UTE.TC && _UTE.TC.length) && ($(_UTE.TC).removeClass(this.CS)); //去除选择元素样式 U.D.DragE = this.TC.length = 0; return this; } } //#endregion //#region 拖拉变化 /* * 获取元素选择范围 * * @param {object} 拖选的元素 * @param {object} 拖选的传参 */ U.D.DragAb = function (UDOD, UDE) { if (UDOD) { UDE = UDE || {}; new U.D.DragAb.init(UDOD, UDE); //初始化拖选 } } /* * 拖动初始化 * * @param {object} 拖选的元素 * @param {object} 拖选的传参 */ U.D.DragAb.init = function (UDOD, UDE) { var _UDTD = $(UDOD), _UDSD = _UDTD.parentg(), //上级元素 _UDPD = _UDTD.prev(), //上面的兄弟节点 _UDND = _UDTD.next(); //下面的兄弟节点 //添加初始化值 U.Ut.AddObj(this, { UDPD: _UDSD, //上级元素 w: _UDSD.width(), //当前长度 pw: _UDSD.parentg().width(), //总长度 UDOD: UDOD, //拖动的元素 UE: U.M.GetMousep(), //鼠标的位置 prev: _UDPD, //上面的兄弟节点 next: _UDND, //下面的兄弟节点 uw: [_UDPD.width(), _UDND.width()] //兄弟节点长度 }); //拖动参数设置 U.Ut.AddObj(this, UDE); //聚焦 UDOD.setCapture(); //拖动元素 $(document.body).bind({ "mousemove": (this.move = U.M.apply(this, UDE.tf ? this.dragB : this.drag)), "mouseup": (this.mup = U.M.apply(this, this.up)) }); } U.D.DragAb.init.prototype = { //拖动左右使用 drag: function () { var _UDVD = this.prev, //上级元素 _UDND = this.next, //下面的兄弟节点 _UW = this.uw, //不变的大小 _UE = this.UE, //鼠标的位置 _UME = U.M.GetMousep(); //当前处理的鼠标位置 _UME["X"] = Math.min(Math.max(-_UW[0], _UME["X"] - _UE["X"]), _UW[1]); _UDVD.css("width", _UW[0] + _UME["X"] + "px"); _UDND.css("width", _UW[1] + _UME["X"] + "px"); //拖动大小处理 (this.scb) && (this.scb()); //拖动回调 }, //拖动菜单 dragB: function () { var _UW, _UDPD = this.UDPD, //上级元素 _UDSD = this.prev, //上级元素 _UPW = this.pw, //总长度 _UW = this.uw[0], //上面兄弟节点的长度 _UE = this.UE, //鼠标的位置 _UME = U.M.GetMousep(); //鼠标位置 _UME["X"] = Math.max(-_UW, _UME["X"] - _UE["X"]); //获取left _UDSD.css("width", _UW + _UME["X"] + "px"); //设置下级兄弟的长度 _UDPD.css("width", (_UW = (_UME["X"] + this.w)) > this.pw ? _UW + "px" : this.pw + "px"); //设置上级兄弟的长度 (this.scb) && (this.scb()); }, //拖动释放 up: function () { this.UDOD.releaseCapture(); //释放聚焦 $(document.body).unbind({ "mousemove": this.move, "mouseup": this.mup }); //释放拖动绑定 (this.upcb) && (this.upcb()); //回调处理 } } //#endregion