HtmlDragAndDrop.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:12k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.dnd.HtmlDragAndDrop");
  9. dojo.require("dojo.dnd.HtmlDragManager");
  10. dojo.require("dojo.dnd.DragAndDrop");
  11. dojo.require("dojo.html.*");
  12. dojo.require("dojo.html.display");
  13. dojo.require("dojo.html.util");
  14. dojo.require("dojo.html.selection");
  15. dojo.require("dojo.html.iframe");
  16. dojo.require("dojo.lang.extras");
  17. dojo.require("dojo.lfx.*");
  18. dojo.require("dojo.event.*");
  19. dojo.declare("dojo.dnd.HtmlDragSource", dojo.dnd.DragSource, {dragClass:"", onDragStart:function () {
  20. var dragObj = new dojo.dnd.HtmlDragObject(this.dragObject, this.type);
  21. if (this.dragClass) {
  22. dragObj.dragClass = this.dragClass;
  23. }
  24. if (this.constrainToContainer) {
  25. dragObj.constrainTo(this.constrainingContainer || this.domNode.parentNode);
  26. }
  27. return dragObj;
  28. }, setDragHandle:function (node) {
  29. node = dojo.byId(node);
  30. dojo.dnd.dragManager.unregisterDragSource(this);
  31. this.domNode = node;
  32. dojo.dnd.dragManager.registerDragSource(this);
  33. }, setDragTarget:function (node) {
  34. this.dragObject = node;
  35. }, constrainTo:function (container) {
  36. this.constrainToContainer = true;
  37. if (container) {
  38. this.constrainingContainer = container;
  39. }
  40. }, onSelected:function () {
  41. for (var i = 0; i < this.dragObjects.length; i++) {
  42. dojo.dnd.dragManager.selectedSources.push(new dojo.dnd.HtmlDragSource(this.dragObjects[i]));
  43. }
  44. }, addDragObjects:function (el) {
  45. for (var i = 0; i < arguments.length; i++) {
  46. this.dragObjects.push(dojo.byId(arguments[i]));
  47. }
  48. }}, function (node, type) {
  49. node = dojo.byId(node);
  50. this.dragObjects = [];
  51. this.constrainToContainer = false;
  52. if (node) {
  53. this.domNode = node;
  54. this.dragObject = node;
  55. this.type = (type) || (this.domNode.nodeName.toLowerCase());
  56. dojo.dnd.DragSource.prototype.reregister.call(this);
  57. }
  58. });
  59. dojo.declare("dojo.dnd.HtmlDragObject", dojo.dnd.DragObject, {dragClass:"", opacity:0.5, createIframe:true, disableX:false, disableY:false, createDragNode:function () {
  60. var node = this.domNode.cloneNode(true);
  61. if (this.dragClass) {
  62. dojo.html.addClass(node, this.dragClass);
  63. }
  64. if (this.opacity < 1) {
  65. dojo.html.setOpacity(node, this.opacity);
  66. }
  67. var ltn = node.tagName.toLowerCase();
  68. var isTr = (ltn == "tr");
  69. if ((isTr) || (ltn == "tbody")) {
  70. var doc = this.domNode.ownerDocument;
  71. var table = doc.createElement("table");
  72. if (isTr) {
  73. var tbody = doc.createElement("tbody");
  74. table.appendChild(tbody);
  75. tbody.appendChild(node);
  76. } else {
  77. table.appendChild(node);
  78. }
  79. var tmpSrcTr = ((isTr) ? this.domNode : this.domNode.firstChild);
  80. var tmpDstTr = ((isTr) ? node : node.firstChild);
  81. var domTds = tmpSrcTr.childNodes;
  82. var cloneTds = tmpDstTr.childNodes;
  83. for (var i = 0; i < domTds.length; i++) {
  84. if ((cloneTds[i]) && (cloneTds[i].style)) {
  85. cloneTds[i].style.width = dojo.html.getContentBox(domTds[i]).width + "px";
  86. }
  87. }
  88. node = table;
  89. }
  90. if ((dojo.render.html.ie55 || dojo.render.html.ie60) && this.createIframe) {
  91. with (node.style) {
  92. top = "0px";
  93. left = "0px";
  94. }
  95. var outer = document.createElement("div");
  96. outer.appendChild(node);
  97. this.bgIframe = new dojo.html.BackgroundIframe(outer);
  98. outer.appendChild(this.bgIframe.iframe);
  99. node = outer;
  100. }
  101. node.style.zIndex = 999;
  102. return node;
  103. }, onDragStart:function (e) {
  104. dojo.html.clearSelection();
  105. this.scrollOffset = dojo.html.getScroll().offset;
  106. this.dragStartPosition = dojo.html.getAbsolutePosition(this.domNode, true);
  107. this.dragOffset = {y:this.dragStartPosition.y - e.pageY, x:this.dragStartPosition.x - e.pageX};
  108. this.dragClone = this.createDragNode();
  109. this.containingBlockPosition = this.domNode.offsetParent ? dojo.html.getAbsolutePosition(this.domNode.offsetParent, true) : {x:0, y:0};
  110. if (this.constrainToContainer) {
  111. this.constraints = this.getConstraints();
  112. }
  113. with (this.dragClone.style) {
  114. position = "absolute";
  115. top = this.dragOffset.y + e.pageY + "px";
  116. left = this.dragOffset.x + e.pageX + "px";
  117. }
  118. dojo.body().appendChild(this.dragClone);
  119. dojo.event.topic.publish("dragStart", {source:this});
  120. }, getConstraints:function () {
  121. if (this.constrainingContainer.nodeName.toLowerCase() == "body") {
  122. var viewport = dojo.html.getViewport();
  123. var width = viewport.width;
  124. var height = viewport.height;
  125. var scroll = dojo.html.getScroll().offset;
  126. var x = scroll.x;
  127. var y = scroll.y;
  128. } else {
  129. var content = dojo.html.getContentBox(this.constrainingContainer);
  130. width = content.width;
  131. height = content.height;
  132. x = this.containingBlockPosition.x + dojo.html.getPixelValue(this.constrainingContainer, "padding-left", true) + dojo.html.getBorderExtent(this.constrainingContainer, "left");
  133. y = this.containingBlockPosition.y + dojo.html.getPixelValue(this.constrainingContainer, "padding-top", true) + dojo.html.getBorderExtent(this.constrainingContainer, "top");
  134. }
  135. var mb = dojo.html.getMarginBox(this.domNode);
  136. return {minX:x, minY:y, maxX:x + width - mb.width, maxY:y + height - mb.height};
  137. }, updateDragOffset:function () {
  138. var scroll = dojo.html.getScroll().offset;
  139. if (scroll.y != this.scrollOffset.y) {
  140. var diff = scroll.y - this.scrollOffset.y;
  141. this.dragOffset.y += diff;
  142. this.scrollOffset.y = scroll.y;
  143. }
  144. if (scroll.x != this.scrollOffset.x) {
  145. var diff = scroll.x - this.scrollOffset.x;
  146. this.dragOffset.x += diff;
  147. this.scrollOffset.x = scroll.x;
  148. }
  149. }, onDragMove:function (e) {
  150. this.updateDragOffset();
  151. var x = this.dragOffset.x + e.pageX;
  152. var y = this.dragOffset.y + e.pageY;
  153. if (this.constrainToContainer) {
  154. if (x < this.constraints.minX) {
  155. x = this.constraints.minX;
  156. }
  157. if (y < this.constraints.minY) {
  158. y = this.constraints.minY;
  159. }
  160. if (x > this.constraints.maxX) {
  161. x = this.constraints.maxX;
  162. }
  163. if (y > this.constraints.maxY) {
  164. y = this.constraints.maxY;
  165. }
  166. }
  167. this.setAbsolutePosition(x, y);
  168. dojo.event.topic.publish("dragMove", {source:this});
  169. }, setAbsolutePosition:function (x, y) {
  170. if (!this.disableY) {
  171. this.dragClone.style.top = y + "px";
  172. }
  173. if (!this.disableX) {
  174. this.dragClone.style.left = x + "px";
  175. }
  176. }, onDragEnd:function (e) {
  177. switch (e.dragStatus) {
  178.   case "dropSuccess":
  179. dojo.html.removeNode(this.dragClone);
  180. this.dragClone = null;
  181. break;
  182.   case "dropFailure":
  183. var startCoords = dojo.html.getAbsolutePosition(this.dragClone, true);
  184. var endCoords = {left:this.dragStartPosition.x + 1, top:this.dragStartPosition.y + 1};
  185. var anim = dojo.lfx.slideTo(this.dragClone, endCoords, 300);
  186. var dragObject = this;
  187. dojo.event.connect(anim, "onEnd", function (e) {
  188. dojo.html.removeNode(dragObject.dragClone);
  189. dragObject.dragClone = null;
  190. });
  191. anim.play();
  192. break;
  193. }
  194. dojo.event.topic.publish("dragEnd", {source:this});
  195. }, constrainTo:function (container) {
  196. this.constrainToContainer = true;
  197. if (container) {
  198. this.constrainingContainer = container;
  199. } else {
  200. this.constrainingContainer = this.domNode.parentNode;
  201. }
  202. }}, function (node, type) {
  203. this.domNode = dojo.byId(node);
  204. this.type = type;
  205. this.constrainToContainer = false;
  206. this.dragSource = null;
  207. dojo.dnd.DragObject.prototype.register.call(this);
  208. });
  209. dojo.declare("dojo.dnd.HtmlDropTarget", dojo.dnd.DropTarget, {vertical:false, onDragOver:function (e) {
  210. if (!this.accepts(e.dragObjects)) {
  211. return false;
  212. }
  213. this.childBoxes = [];
  214. for (var i = 0, child; i < this.domNode.childNodes.length; i++) {
  215. child = this.domNode.childNodes[i];
  216. if (child.nodeType != dojo.html.ELEMENT_NODE) {
  217. continue;
  218. }
  219. var pos = dojo.html.getAbsolutePosition(child, true);
  220. var inner = dojo.html.getBorderBox(child);
  221. this.childBoxes.push({top:pos.y, bottom:pos.y + inner.height, left:pos.x, right:pos.x + inner.width, height:inner.height, width:inner.width, node:child});
  222. }
  223. return true;
  224. }, _getNodeUnderMouse:function (e) {
  225. for (var i = 0, child; i < this.childBoxes.length; i++) {
  226. with (this.childBoxes[i]) {
  227. if (e.pageX >= left && e.pageX <= right && e.pageY >= top && e.pageY <= bottom) {
  228. return i;
  229. }
  230. }
  231. }
  232. return -1;
  233. }, createDropIndicator:function () {
  234. this.dropIndicator = document.createElement("div");
  235. with (this.dropIndicator.style) {
  236. position = "absolute";
  237. zIndex = 999;
  238. if (this.vertical) {
  239. borderLeftWidth = "1px";
  240. borderLeftColor = "black";
  241. borderLeftStyle = "solid";
  242. height = dojo.html.getBorderBox(this.domNode).height + "px";
  243. top = dojo.html.getAbsolutePosition(this.domNode, true).y + "px";
  244. } else {
  245. borderTopWidth = "1px";
  246. borderTopColor = "black";
  247. borderTopStyle = "solid";
  248. width = dojo.html.getBorderBox(this.domNode).width + "px";
  249. left = dojo.html.getAbsolutePosition(this.domNode, true).x + "px";
  250. }
  251. }
  252. }, onDragMove:function (e, dragObjects) {
  253. var i = this._getNodeUnderMouse(e);
  254. if (!this.dropIndicator) {
  255. this.createDropIndicator();
  256. }
  257. var gravity = this.vertical ? dojo.html.gravity.WEST : dojo.html.gravity.NORTH;
  258. var hide = false;
  259. if (i < 0) {
  260. if (this.childBoxes.length) {
  261. var before = (dojo.html.gravity(this.childBoxes[0].node, e) & gravity);
  262. if (before) {
  263. hide = true;
  264. }
  265. } else {
  266. var before = true;
  267. }
  268. } else {
  269. var child = this.childBoxes[i];
  270. var before = (dojo.html.gravity(child.node, e) & gravity);
  271. if (child.node === dragObjects[0].dragSource.domNode) {
  272. hide = true;
  273. } else {
  274. var currentPosChild = before ? (i > 0 ? this.childBoxes[i - 1] : child) : (i < this.childBoxes.length - 1 ? this.childBoxes[i + 1] : child);
  275. if (currentPosChild.node === dragObjects[0].dragSource.domNode) {
  276. hide = true;
  277. }
  278. }
  279. }
  280. if (hide) {
  281. this.dropIndicator.style.display = "none";
  282. return;
  283. } else {
  284. this.dropIndicator.style.display = "";
  285. }
  286. this.placeIndicator(e, dragObjects, i, before);
  287. if (!dojo.html.hasParent(this.dropIndicator)) {
  288. dojo.body().appendChild(this.dropIndicator);
  289. }
  290. }, placeIndicator:function (e, dragObjects, boxIndex, before) {
  291. var targetProperty = this.vertical ? "left" : "top";
  292. var child;
  293. if (boxIndex < 0) {
  294. if (this.childBoxes.length) {
  295. child = before ? this.childBoxes[0] : this.childBoxes[this.childBoxes.length - 1];
  296. } else {
  297. this.dropIndicator.style[targetProperty] = dojo.html.getAbsolutePosition(this.domNode, true)[this.vertical ? "x" : "y"] + "px";
  298. }
  299. } else {
  300. child = this.childBoxes[boxIndex];
  301. }
  302. if (child) {
  303. this.dropIndicator.style[targetProperty] = (before ? child[targetProperty] : child[this.vertical ? "right" : "bottom"]) + "px";
  304. if (this.vertical) {
  305. this.dropIndicator.style.height = child.height + "px";
  306. this.dropIndicator.style.top = child.top + "px";
  307. } else {
  308. this.dropIndicator.style.width = child.width + "px";
  309. this.dropIndicator.style.left = child.left + "px";
  310. }
  311. }
  312. }, onDragOut:function (e) {
  313. if (this.dropIndicator) {
  314. dojo.html.removeNode(this.dropIndicator);
  315. delete this.dropIndicator;
  316. }
  317. }, onDrop:function (e) {
  318. this.onDragOut(e);
  319. var i = this._getNodeUnderMouse(e);
  320. var gravity = this.vertical ? dojo.html.gravity.WEST : dojo.html.gravity.NORTH;
  321. if (i < 0) {
  322. if (this.childBoxes.length) {
  323. if (dojo.html.gravity(this.childBoxes[0].node, e) & gravity) {
  324. return this.insert(e, this.childBoxes[0].node, "before");
  325. } else {
  326. return this.insert(e, this.childBoxes[this.childBoxes.length - 1].node, "after");
  327. }
  328. }
  329. return this.insert(e, this.domNode, "append");
  330. }
  331. var child = this.childBoxes[i];
  332. if (dojo.html.gravity(child.node, e) & gravity) {
  333. return this.insert(e, child.node, "before");
  334. } else {
  335. return this.insert(e, child.node, "after");
  336. }
  337. }, insert:function (e, refNode, position) {
  338. var node = e.dragObject.domNode;
  339. if (position == "before") {
  340. return dojo.html.insertBefore(node, refNode);
  341. } else {
  342. if (position == "after") {
  343. return dojo.html.insertAfter(node, refNode);
  344. } else {
  345. if (position == "append") {
  346. refNode.appendChild(node);
  347. return true;
  348. }
  349. }
  350. }
  351. return false;
  352. }}, function (node, types) {
  353. if (arguments.length == 0) {
  354. return;
  355. }
  356. this.domNode = dojo.byId(node);
  357. dojo.dnd.DropTarget.call(this);
  358. if (types && dojo.lang.isString(types)) {
  359. types = [types];
  360. }
  361. this.acceptedTypes = types || [];
  362. dojo.dnd.dragManager.registerDropTarget(this);
  363. });