回答:(function (f) { function c(m) { var i = f.data(m.data.target, "draggable"); var h = i.options; var g = i.proxy; var l = m.data; var k = l.startLeft + m.pageX - l.startX; var j = l.startTop + m.pageY - l.startY; if (g) { if (g.parent() == document.body) { if (h.deltaX != null && h.deltaX != undefined) { k = m.pageX + h.deltaX } else { k = m.pageX - m.data.offsetWidth } if (h.deltaY != null && h.deltaY != undefined) { j = m.pageY + h.deltaY } else { j = m.pageY - m.data.offsetHeight } } else { if (h.deltaX != null && h.deltaX != undefined) { k += m.data.offsetWidth + h.deltaX } if (h.deltaY != null && h.deltaY != undefined) { j += m.data.offsetHeight + h.deltaY } } } if (m.data.parent != document.body) { k += f(m.data.parent).scrollLeft(); j += f(m.data.parent).scrollTop() } if (h.axis == "h") { l.left = k } else { if (h.axis == "v") { l.top = j } else { l.left = k; l.top = j<0?0:j } } } function e(j) { var i = f.data(j.data.target, "draggable"); var h = i.options; var g = i.proxy; if (!g) { g = f(j.data.target) } g.css({ left : j.data.left, top : j.data.top }); f("body").css("cursor", h.cursor) } function a(k) { f.fn.draggable.isDragging = true; var j = f.data(k.data.target, "draggable"); var i = j.options; var g = f(".droppable").filter(function () { return k.data.target != this }).filter(function () { var l = f.data(this, "droppable").options.accept; if (l) { return f(l).filter(function () { return this == k.data.target }).length > 0 } else { return true } }); j.droppables = g; var h = j.proxy; if (!h) { if (i.proxy) { if (i.proxy == "clone") { h = f(k.data.target).clone().insertAfter(k.data.target) } else { h = i.proxy.call(k.data.target, k.data.target) } j.proxy = h } else { h = f(k.data.target) } } h.css("position", "absolute"); c(k); e(k); i.onStartDrag.call(k.data.target, k); return false } function b(i) { var h = f.data(i.data.target, "draggable"); c(i); if (h.options.onDrag.call(i.data.target, i) != false) { e(i) } var g = i.data.target; h.droppables.each(function () { var k = f(this); if (k.droppable("options").disabled) { return } var j = k.offset(); if (i.pageX > j.left && i.pageX < j.left + k.outerWidth() && i.pageY > j.top && i.pageY < j.top + k.outerHeight()) { if (!this.entered) { f(this).trigger("_dragenter", ); this.entered = true } f(this).trigger("_dragover", ) } else { if (this.entered) { f(this).trigger("_dragleave", ); this.entered = false } } }); return false } function d(n) { f.fn.draggable.isDragging = false; b(n); var j = f.data(n.data.target, "draggable"); var g = j.proxy; var i = j.options; if (i.revert) { if (k() == true) { f(n.data.target).css({ position : n.data.startPosition, left : n.data.startLeft, top : n.data.startTop }) } else { if (g) { var m, l; if (g.parent() == document.body) { m = n.data.startX - n.data.offsetWidth; l = n.data.startY - n.data.offsetHeight } else { m = n.data.startLeft; l = n.data.startTop } g.animate({ left : m, top : l }, function () { h() }) } else { f(n.data.target).animate({ left : n.data.startLeft, top : n.data.startTop }, function () { f(n.data.target).css("position", n.data.startPosition) }) } } } else { f(n.data.target).css({ position : "absolute", left : n.data.left, top : n.data.top }); k() } i.onStopDrag.call(n.data.target, n); f(document).unbind(".draggable"); setTimeout(function () { f("body").css("cursor", "") }, 100); function h() { if (g) { g.remove() } j.proxy = null } function k() { var o = false; j.droppables.each(function () { var q = f(this); if (q.droppable("options").disabled) { return } var p = q.offset(); if (n.pageX > p.left && n.pageX < p.left + q.outerWidth() && n.pageY > p.top && n.pageY < p.top + q.outerHeight()) { if (i.revert) { f(n.data.target).css({ position : n.data.startPosition, left : n.data.startLeft, top : n.data.startTop }) } f(this).trigger("_drop", ); h(); o = true; this.entered = false; return false } }); if (!o && !i.revert) { h() } return o } return false } f.fn.draggable = function (g, h) { if (typeof g == "string") { return f.fn.draggable.methods(this, h) } return this.each(function () { var j; var l = f.data(this, "draggable"); if (l) { l.handle.unbind(".draggable"); j = f.extend(l.options, g) } else { j = f.extend({}, f.fn.draggable.defaults, g || {}) } var k = j.handle ? (typeof j.handle == "string" ? f(j.handle, this) : j.handle) : f(this); f.data(this, "draggable", { options : j, handle : k }); if (j.disabled) { f(this).css("cursor", ""); return } k.unbind(".draggable").bind("mousemove.draggable", { target : this }, function (n) { if (f.fn.draggable.isDragging) { return } var m = f.data(n.data.target, "draggable").options; if (i(n)) { f(this).css("cursor", m.cursor) } else { f(this).css("cursor", "") } }).bind("mouseleave.draggable", { target : this }, function (m) { f(this).css("cursor", "") }).bind("mousedown.draggable", { target : this }, function (p) { if (i(p) == false) { return } f(this).css("cursor", ""); var m = f(p.data.target).position(); var q = f(p.data.target).offset(); var o = { startPosition : f(p.data.target).css("position"), startLeft : m.left, startTop : m.top, left : m.left, top : m.top, startX : p.pageX, startY : p.pageY, offsetWidth : (p.pageX - q.left), offsetHeight : (p.pageY - q.top), target : p.data.target, parent : f(p.data.target).parent() }; f.extend(p.data, o); var n = f.data(p.data.target, "draggable").options; if (n.onBeforeDrag.call(p.data.target, p) == false) { return } f(document).bind("mousedown.draggable", p.data, a); f(document).bind("mousemove.draggable", p.data, b); f(document).bind("mouseup.draggable", p.data, d) }); function i(u) { var n = f.data(u.data.target, "draggable"); var s = n.handle; var q = f(s).offset(); var o = f(s).outerWidth(); var w = f(s).outerHeight(); var x = u.pageY - q.top; var m = q.left + o - u.pageX; var v = q.top + w - u.pageY; var p = u.pageX - q.left; return Math.min(x, m, v, p) > n.options.edge } }) }; f.fn.draggable.methods = { options : function (g) { return f.data(g, "draggable").options }, proxy : function (g) { return f.data(g, "draggable").proxy }, enable : function (g) { return g.each(function () { f(this).draggable({ disabled : false }) }) }, disable : function (g) { return g.each(function () { f(this).draggable({ disabled : true }) }) } }; f.fn.draggable.defaults = { proxy : null, revert : false, cursor : "move", deltaX : null, deltaY : null, handle : null, disabled : false, edge : 0, axis : null, onBeforeDrag : function (g) {}, onStartDrag : function (g) {}, onDrag : function (g) {}, onStopDrag : function (g) {} }; f.fn.draggable.isDragging = false})(jQuery);