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

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.html.layout");
  9. dojo.require("dojo.html.common");
  10. dojo.require("dojo.html.style");
  11. dojo.require("dojo.html.display");
  12. dojo.html.sumAncestorProperties = function (node, prop) {
  13. node = dojo.byId(node);
  14. if (!node) {
  15. return 0;
  16. }
  17. var retVal = 0;
  18. while (node) {
  19. if (dojo.html.getComputedStyle(node, "position") == "fixed") {
  20. return 0;
  21. }
  22. var val = node[prop];
  23. if (val) {
  24. retVal += val - 0;
  25. if (node == dojo.body()) {
  26. break;
  27. }
  28. }
  29. node = node.parentNode;
  30. }
  31. return retVal;
  32. };
  33. dojo.html.setStyleAttributes = function (node, attributes) {
  34. node = dojo.byId(node);
  35. var splittedAttribs = attributes.replace(/(;)?s*$/, "").split(";");
  36. for (var i = 0; i < splittedAttribs.length; i++) {
  37. var nameValue = splittedAttribs[i].split(":");
  38. var name = nameValue[0].replace(/s*$/, "").replace(/^s*/, "").toLowerCase();
  39. var value = nameValue[1].replace(/s*$/, "").replace(/^s*/, "");
  40. switch (name) {
  41.   case "opacity":
  42. dojo.html.setOpacity(node, value);
  43. break;
  44.   case "content-height":
  45. dojo.html.setContentBox(node, {height:value});
  46. break;
  47.   case "content-width":
  48. dojo.html.setContentBox(node, {width:value});
  49. break;
  50.   case "outer-height":
  51. dojo.html.setMarginBox(node, {height:value});
  52. break;
  53.   case "outer-width":
  54. dojo.html.setMarginBox(node, {width:value});
  55. break;
  56.   default:
  57. node.style[dojo.html.toCamelCase(name)] = value;
  58. }
  59. }
  60. };
  61. dojo.html.boxSizing = {MARGIN_BOX:"margin-box", BORDER_BOX:"border-box", PADDING_BOX:"padding-box", CONTENT_BOX:"content-box"};
  62. dojo.html.getAbsolutePosition = dojo.html.abs = function (node, includeScroll, boxType) {
  63. node = dojo.byId(node, node.ownerDocument);
  64. var ret = {x:0, y:0};
  65. var bs = dojo.html.boxSizing;
  66. if (!boxType) {
  67. boxType = bs.CONTENT_BOX;
  68. }
  69. var nativeBoxType = 2;
  70. var targetBoxType;
  71. switch (boxType) {
  72.   case bs.MARGIN_BOX:
  73. targetBoxType = 3;
  74. break;
  75.   case bs.BORDER_BOX:
  76. targetBoxType = 2;
  77. break;
  78.   case bs.PADDING_BOX:
  79.   default:
  80. targetBoxType = 1;
  81. break;
  82.   case bs.CONTENT_BOX:
  83. targetBoxType = 0;
  84. break;
  85. }
  86. var h = dojo.render.html;
  87. var db = document["body"] || document["documentElement"];
  88. if (h.ie) {
  89. with (node.getBoundingClientRect()) {
  90. ret.x = left - 2;
  91. ret.y = top - 2;
  92. }
  93. } else {
  94. if (document.getBoxObjectFor) {
  95. nativeBoxType = 1;
  96. try {
  97. var bo = document.getBoxObjectFor(node);
  98. ret.x = bo.x - dojo.html.sumAncestorProperties(node, "scrollLeft");
  99. ret.y = bo.y - dojo.html.sumAncestorProperties(node, "scrollTop");
  100. }
  101. catch (e) {
  102. }
  103. } else {
  104. if (node["offsetParent"]) {
  105. var endNode;
  106. if ((h.safari) && (node.style.getPropertyValue("position") == "absolute") && (node.parentNode == db)) {
  107. endNode = db;
  108. } else {
  109. endNode = db.parentNode;
  110. }
  111. if (node.parentNode != db) {
  112. var nd = node;
  113. if (dojo.render.html.opera) {
  114. nd = db;
  115. }
  116. ret.x -= dojo.html.sumAncestorProperties(nd, "scrollLeft");
  117. ret.y -= dojo.html.sumAncestorProperties(nd, "scrollTop");
  118. }
  119. var curnode = node;
  120. do {
  121. var n = curnode["offsetLeft"];
  122. if (!h.opera || n > 0) {
  123. ret.x += isNaN(n) ? 0 : n;
  124. }
  125. var m = curnode["offsetTop"];
  126. ret.y += isNaN(m) ? 0 : m;
  127. curnode = curnode.offsetParent;
  128. } while ((curnode != endNode) && (curnode != null));
  129. } else {
  130. if (node["x"] && node["y"]) {
  131. ret.x += isNaN(node.x) ? 0 : node.x;
  132. ret.y += isNaN(node.y) ? 0 : node.y;
  133. }
  134. }
  135. }
  136. }
  137. if (includeScroll) {
  138. var scroll = dojo.html.getScroll();
  139. ret.y += scroll.top;
  140. ret.x += scroll.left;
  141. }
  142. var extentFuncArray = [dojo.html.getPaddingExtent, dojo.html.getBorderExtent, dojo.html.getMarginExtent];
  143. if (nativeBoxType > targetBoxType) {
  144. for (var i = targetBoxType; i < nativeBoxType; ++i) {
  145. ret.y += extentFuncArray[i](node, "top");
  146. ret.x += extentFuncArray[i](node, "left");
  147. }
  148. } else {
  149. if (nativeBoxType < targetBoxType) {
  150. for (var i = targetBoxType; i > nativeBoxType; --i) {
  151. ret.y -= extentFuncArray[i - 1](node, "top");
  152. ret.x -= extentFuncArray[i - 1](node, "left");
  153. }
  154. }
  155. }
  156. ret.top = ret.y;
  157. ret.left = ret.x;
  158. return ret;
  159. };
  160. dojo.html.isPositionAbsolute = function (node) {
  161. return (dojo.html.getComputedStyle(node, "position") == "absolute");
  162. };
  163. dojo.html._sumPixelValues = function (node, selectors, autoIsZero) {
  164. var total = 0;
  165. for (var x = 0; x < selectors.length; x++) {
  166. total += dojo.html.getPixelValue(node, selectors[x], autoIsZero);
  167. }
  168. return total;
  169. };
  170. dojo.html.getMargin = function (node) {
  171. return {width:dojo.html._sumPixelValues(node, ["margin-left", "margin-right"], (dojo.html.getComputedStyle(node, "position") == "absolute")), height:dojo.html._sumPixelValues(node, ["margin-top", "margin-bottom"], (dojo.html.getComputedStyle(node, "position") == "absolute"))};
  172. };
  173. dojo.html.getBorder = function (node) {
  174. return {width:dojo.html.getBorderExtent(node, "left") + dojo.html.getBorderExtent(node, "right"), height:dojo.html.getBorderExtent(node, "top") + dojo.html.getBorderExtent(node, "bottom")};
  175. };
  176. dojo.html.getBorderExtent = function (node, side) {
  177. return (dojo.html.getStyle(node, "border-" + side + "-style") == "none" ? 0 : dojo.html.getPixelValue(node, "border-" + side + "-width"));
  178. };
  179. dojo.html.getMarginExtent = function (node, side) {
  180. return dojo.html._sumPixelValues(node, ["margin-" + side], dojo.html.isPositionAbsolute(node));
  181. };
  182. dojo.html.getPaddingExtent = function (node, side) {
  183. return dojo.html._sumPixelValues(node, ["padding-" + side], true);
  184. };
  185. dojo.html.getPadding = function (node) {
  186. return {width:dojo.html._sumPixelValues(node, ["padding-left", "padding-right"], true), height:dojo.html._sumPixelValues(node, ["padding-top", "padding-bottom"], true)};
  187. };
  188. dojo.html.getPadBorder = function (node) {
  189. var pad = dojo.html.getPadding(node);
  190. var border = dojo.html.getBorder(node);
  191. return {width:pad.width + border.width, height:pad.height + border.height};
  192. };
  193. dojo.html.getBoxSizing = function (node) {
  194. var h = dojo.render.html;
  195. var bs = dojo.html.boxSizing;
  196. if (((h.ie) || (h.opera)) && node.nodeName.toLowerCase() != "img") {
  197. var cm = document["compatMode"];
  198. if ((cm == "BackCompat") || (cm == "QuirksMode")) {
  199. return bs.BORDER_BOX;
  200. } else {
  201. return bs.CONTENT_BOX;
  202. }
  203. } else {
  204. if (arguments.length == 0) {
  205. node = document.documentElement;
  206. }
  207. var sizing;
  208. if (!h.ie) {
  209. sizing = dojo.html.getStyle(node, "-moz-box-sizing");
  210. if (!sizing) {
  211. sizing = dojo.html.getStyle(node, "box-sizing");
  212. }
  213. }
  214. return (sizing ? sizing : bs.CONTENT_BOX);
  215. }
  216. };
  217. dojo.html.isBorderBox = function (node) {
  218. return (dojo.html.getBoxSizing(node) == dojo.html.boxSizing.BORDER_BOX);
  219. };
  220. dojo.html.getBorderBox = function (node) {
  221. node = dojo.byId(node);
  222. return {width:node.offsetWidth, height:node.offsetHeight};
  223. };
  224. dojo.html.getPaddingBox = function (node) {
  225. var box = dojo.html.getBorderBox(node);
  226. var border = dojo.html.getBorder(node);
  227. return {width:box.width - border.width, height:box.height - border.height};
  228. };
  229. dojo.html.getContentBox = function (node) {
  230. node = dojo.byId(node);
  231. var padborder = dojo.html.getPadBorder(node);
  232. return {width:node.offsetWidth - padborder.width, height:node.offsetHeight - padborder.height};
  233. };
  234. dojo.html.setContentBox = function (node, args) {
  235. node = dojo.byId(node);
  236. var width = 0;
  237. var height = 0;
  238. var isbb = dojo.html.isBorderBox(node);
  239. var padborder = (isbb ? dojo.html.getPadBorder(node) : {width:0, height:0});
  240. var ret = {};
  241. if (typeof args.width != "undefined") {
  242. width = args.width + padborder.width;
  243. ret.width = dojo.html.setPositivePixelValue(node, "width", width);
  244. }
  245. if (typeof args.height != "undefined") {
  246. height = args.height + padborder.height;
  247. ret.height = dojo.html.setPositivePixelValue(node, "height", height);
  248. }
  249. return ret;
  250. };
  251. dojo.html.getMarginBox = function (node) {
  252. var borderbox = dojo.html.getBorderBox(node);
  253. var margin = dojo.html.getMargin(node);
  254. return {width:borderbox.width + margin.width, height:borderbox.height + margin.height};
  255. };
  256. dojo.html.setMarginBox = function (node, args) {
  257. node = dojo.byId(node);
  258. var width = 0;
  259. var height = 0;
  260. var isbb = dojo.html.isBorderBox(node);
  261. var padborder = (!isbb ? dojo.html.getPadBorder(node) : {width:0, height:0});
  262. var margin = dojo.html.getMargin(node);
  263. var ret = {};
  264. if (typeof args.width != "undefined") {
  265. width = args.width - padborder.width;
  266. width -= margin.width;
  267. ret.width = dojo.html.setPositivePixelValue(node, "width", width);
  268. }
  269. if (typeof args.height != "undefined") {
  270. height = args.height - padborder.height;
  271. height -= margin.height;
  272. ret.height = dojo.html.setPositivePixelValue(node, "height", height);
  273. }
  274. return ret;
  275. };
  276. dojo.html.getElementBox = function (node, type) {
  277. var bs = dojo.html.boxSizing;
  278. switch (type) {
  279.   case bs.MARGIN_BOX:
  280. return dojo.html.getMarginBox(node);
  281.   case bs.BORDER_BOX:
  282. return dojo.html.getBorderBox(node);
  283.   case bs.PADDING_BOX:
  284. return dojo.html.getPaddingBox(node);
  285.   case bs.CONTENT_BOX:
  286.   default:
  287. return dojo.html.getContentBox(node);
  288. }
  289. };
  290. dojo.html.toCoordinateObject = dojo.html.toCoordinateArray = function (coords, includeScroll, boxtype) {
  291. if (coords instanceof Array || typeof coords == "array") {
  292. dojo.deprecated("dojo.html.toCoordinateArray", "use dojo.html.toCoordinateObject({left: , top: , width: , height: }) instead", "0.5");
  293. while (coords.length < 4) {
  294. coords.push(0);
  295. }
  296. while (coords.length > 4) {
  297. coords.pop();
  298. }
  299. var ret = {left:coords[0], top:coords[1], width:coords[2], height:coords[3]};
  300. } else {
  301. if (!coords.nodeType && !(coords instanceof String || typeof coords == "string") && ("width" in coords || "height" in coords || "left" in coords || "x" in coords || "top" in coords || "y" in coords)) {
  302. var ret = {left:coords.left || coords.x || 0, top:coords.top || coords.y || 0, width:coords.width || 0, height:coords.height || 0};
  303. } else {
  304. var node = dojo.byId(coords);
  305. var pos = dojo.html.abs(node, includeScroll, boxtype);
  306. var marginbox = dojo.html.getMarginBox(node);
  307. var ret = {left:pos.left, top:pos.top, width:marginbox.width, height:marginbox.height};
  308. }
  309. }
  310. ret.x = ret.left;
  311. ret.y = ret.top;
  312. return ret;
  313. };
  314. dojo.html.setMarginBoxWidth = dojo.html.setOuterWidth = function (node, width) {
  315. return dojo.html._callDeprecated("setMarginBoxWidth", "setMarginBox", arguments, "width");
  316. };
  317. dojo.html.setMarginBoxHeight = dojo.html.setOuterHeight = function () {
  318. return dojo.html._callDeprecated("setMarginBoxHeight", "setMarginBox", arguments, "height");
  319. };
  320. dojo.html.getMarginBoxWidth = dojo.html.getOuterWidth = function () {
  321. return dojo.html._callDeprecated("getMarginBoxWidth", "getMarginBox", arguments, null, "width");
  322. };
  323. dojo.html.getMarginBoxHeight = dojo.html.getOuterHeight = function () {
  324. return dojo.html._callDeprecated("getMarginBoxHeight", "getMarginBox", arguments, null, "height");
  325. };
  326. dojo.html.getTotalOffset = function (node, type, includeScroll) {
  327. return dojo.html._callDeprecated("getTotalOffset", "getAbsolutePosition", arguments, null, type);
  328. };
  329. dojo.html.getAbsoluteX = function (node, includeScroll) {
  330. return dojo.html._callDeprecated("getAbsoluteX", "getAbsolutePosition", arguments, null, "x");
  331. };
  332. dojo.html.getAbsoluteY = function (node, includeScroll) {
  333. return dojo.html._callDeprecated("getAbsoluteY", "getAbsolutePosition", arguments, null, "y");
  334. };
  335. dojo.html.totalOffsetLeft = function (node, includeScroll) {
  336. return dojo.html._callDeprecated("totalOffsetLeft", "getAbsolutePosition", arguments, null, "left");
  337. };
  338. dojo.html.totalOffsetTop = function (node, includeScroll) {
  339. return dojo.html._callDeprecated("totalOffsetTop", "getAbsolutePosition", arguments, null, "top");
  340. };
  341. dojo.html.getMarginWidth = function (node) {
  342. return dojo.html._callDeprecated("getMarginWidth", "getMargin", arguments, null, "width");
  343. };
  344. dojo.html.getMarginHeight = function (node) {
  345. return dojo.html._callDeprecated("getMarginHeight", "getMargin", arguments, null, "height");
  346. };
  347. dojo.html.getBorderWidth = function (node) {
  348. return dojo.html._callDeprecated("getBorderWidth", "getBorder", arguments, null, "width");
  349. };
  350. dojo.html.getBorderHeight = function (node) {
  351. return dojo.html._callDeprecated("getBorderHeight", "getBorder", arguments, null, "height");
  352. };
  353. dojo.html.getPaddingWidth = function (node) {
  354. return dojo.html._callDeprecated("getPaddingWidth", "getPadding", arguments, null, "width");
  355. };
  356. dojo.html.getPaddingHeight = function (node) {
  357. return dojo.html._callDeprecated("getPaddingHeight", "getPadding", arguments, null, "height");
  358. };
  359. dojo.html.getPadBorderWidth = function (node) {
  360. return dojo.html._callDeprecated("getPadBorderWidth", "getPadBorder", arguments, null, "width");
  361. };
  362. dojo.html.getPadBorderHeight = function (node) {
  363. return dojo.html._callDeprecated("getPadBorderHeight", "getPadBorder", arguments, null, "height");
  364. };
  365. dojo.html.getBorderBoxWidth = dojo.html.getInnerWidth = function () {
  366. return dojo.html._callDeprecated("getBorderBoxWidth", "getBorderBox", arguments, null, "width");
  367. };
  368. dojo.html.getBorderBoxHeight = dojo.html.getInnerHeight = function () {
  369. return dojo.html._callDeprecated("getBorderBoxHeight", "getBorderBox", arguments, null, "height");
  370. };
  371. dojo.html.getContentBoxWidth = dojo.html.getContentWidth = function () {
  372. return dojo.html._callDeprecated("getContentBoxWidth", "getContentBox", arguments, null, "width");
  373. };
  374. dojo.html.getContentBoxHeight = dojo.html.getContentHeight = function () {
  375. return dojo.html._callDeprecated("getContentBoxHeight", "getContentBox", arguments, null, "height");
  376. };
  377. dojo.html.setContentBoxWidth = dojo.html.setContentWidth = function (node, width) {
  378. return dojo.html._callDeprecated("setContentBoxWidth", "setContentBox", arguments, "width");
  379. };
  380. dojo.html.setContentBoxHeight = dojo.html.setContentHeight = function (node, height) {
  381. return dojo.html._callDeprecated("setContentBoxHeight", "setContentBox", arguments, "height");
  382. };