www.gusucode.com > ecShop PHP网上商城系统 粉丝修复版 v2.7.3源码程序 > ecshop_xf_v2.7.3/install/js/draggable.js
function getAbsPosition(target) { var pos = {x:0, y:0}; while (target != null) { pos.x += target.offsetLeft; pos.y += target.offsetTop; target = target.offsetParent; } return pos; } var EventManager = { "attachEvent" : function (oTarget, sType, fHandle, bUseCapture) { bUseCapture = (bUseCapture === true); if (oTarget.addEventListener) { oTarget.addEventListener(sType, fHandle, bUseCapture); } else if (oTarget.attachEvent) { oTarget.attachEvent("on" + sType, fHandle); } else { throw new Error("EventManager.attachEvent() fail."); } }, "detachEvent" : function (oTarget, sType, fHandle, bUseCapture) { bUseCapture = (bUseCapture === true); if (oTarget.removeEventListener) { oTarget.removeEventListener(sType, fHandle, bUseCapture); } else if (oTarget.detachEvent) { oTarget.detachEvent("on" + sType, fHandle); } else { throw new Error("EventManager.detachEvent() fail."); } }, "stopPropagation" : function (e) { if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } }, "preventDefault" : function (e) { if(e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } } }; function Draggable () {} Draggable.prototype.range = null; /** * @param dn stands for "dragged node" * @param fn stands for "flagged node" */ Draggable.prototype.bindDragNode = function (dn, fn) { dn = typeof(dn) === "string" ? document.getElementById(dn) : dn; fn = typeof(fn) === "string" ? document.getElementById(fn) : (typeof(fn) === "undefined" ? dn : fn); var self = this; EventManager.attachEvent(fn, "mouseover", function () { fn.style.cursor = "move"; }); EventManager.attachEvent(fn, "mousedown", function (e) { e = e || window.event; var absPos = getAbsPosition(dn) deltaX = e.clientX - absPos.x, deltaY = e.clientY - absPos.y; fn.style.cursor = "auto"; dn.style.zIndex = self.constructor.zIndex++; EventManager.attachEvent(document, "mousemove", moveHandler); EventManager.attachEvent(document, "mouseup", upHandler); EventManager.preventDefault(e); function moveHandler(e2) { e2 = e2 || window.event; var left = e2.clientX - deltaX, top = e2.clientY - deltaY; fn.style.cursor = "auto"; if (self.range) { var x1 = self.range.x1, y1 = self.range.y1, x2 = self.range.x2, y2 = self.range.y2, w = dn.offsetWidth, h = dn.offsetHeight; left = left < x1 ? x1 : (left > x2 - w ? x2 - w : left); top = top < y1 ? y1 : (top > y2 - h ? y2 - h : top); } dn.style.left = left + "px"; dn.style.top = top + "px"; EventManager.preventDefault(e2); } function upHandler() { fn.style.cursor = "move"; EventManager.detachEvent(document, "mousemove", moveHandler); EventManager.detachEvent(document, "mouseup", upHandler); } }); EventManager.attachEvent(window, "unload", function () { dn = null; fn = null; }); }; Draggable.zIndex = 0; Draggable.prototype.setRange = function (xx1, yy1, xx2, yy2) { this.range = {x1 : xx1, y1 : yy1, x2 : xx2, y2 : yy2}; }; Draggable.prototype.clearRange = function () { this.range = null; };