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

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.util");
  9. dojo.require("dojo.html.layout");
  10. dojo.html.getElementWindow = function (element) {
  11. return dojo.html.getDocumentWindow(element.ownerDocument);
  12. };
  13. dojo.html.getDocumentWindow = function (doc) {
  14. if (dojo.render.html.safari && !doc._parentWindow) {
  15. var fix = function (win) {
  16. win.document._parentWindow = win;
  17. for (var i = 0; i < win.frames.length; i++) {
  18. fix(win.frames[i]);
  19. }
  20. };
  21. fix(window.top);
  22. }
  23. if (dojo.render.html.ie && window !== document.parentWindow && !doc._parentWindow) {
  24. doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
  25. var win = doc._parentWindow;
  26. doc._parentWindow = null;
  27. return win;
  28. }
  29. return doc._parentWindow || doc.parentWindow || doc.defaultView;
  30. };
  31. dojo.html.gravity = function (node, e) {
  32. node = dojo.byId(node);
  33. var mouse = dojo.html.getCursorPosition(e);
  34. with (dojo.html) {
  35. var absolute = getAbsolutePosition(node, true);
  36. var bb = getBorderBox(node);
  37. var nodecenterx = absolute.x + (bb.width / 2);
  38. var nodecentery = absolute.y + (bb.height / 2);
  39. }
  40. with (dojo.html.gravity) {
  41. return ((mouse.x < nodecenterx ? WEST : EAST) | (mouse.y < nodecentery ? NORTH : SOUTH));
  42. }
  43. };
  44. dojo.html.gravity.NORTH = 1;
  45. dojo.html.gravity.SOUTH = 1 << 1;
  46. dojo.html.gravity.EAST = 1 << 2;
  47. dojo.html.gravity.WEST = 1 << 3;
  48. dojo.html.overElement = function (element, e) {
  49. element = dojo.byId(element);
  50. var mouse = dojo.html.getCursorPosition(e);
  51. var bb = dojo.html.getBorderBox(element);
  52. var absolute = dojo.html.getAbsolutePosition(element, true, dojo.html.boxSizing.BORDER_BOX);
  53. var top = absolute.y;
  54. var bottom = top + bb.height;
  55. var left = absolute.x;
  56. var right = left + bb.width;
  57. return (mouse.x >= left && mouse.x <= right && mouse.y >= top && mouse.y <= bottom);
  58. };
  59. dojo.html.renderedTextContent = function (node) {
  60. node = dojo.byId(node);
  61. var result = "";
  62. if (node == null) {
  63. return result;
  64. }
  65. for (var i = 0; i < node.childNodes.length; i++) {
  66. switch (node.childNodes[i].nodeType) {
  67.   case 1:
  68.   case 5:
  69. var display = "unknown";
  70. try {
  71. display = dojo.html.getStyle(node.childNodes[i], "display");
  72. }
  73. catch (E) {
  74. }
  75. switch (display) {
  76.   case "block":
  77.   case "list-item":
  78.   case "run-in":
  79.   case "table":
  80.   case "table-row-group":
  81.   case "table-header-group":
  82.   case "table-footer-group":
  83.   case "table-row":
  84.   case "table-column-group":
  85.   case "table-column":
  86.   case "table-cell":
  87.   case "table-caption":
  88. result += "n";
  89. result += dojo.html.renderedTextContent(node.childNodes[i]);
  90. result += "n";
  91. break;
  92.   case "none":
  93. break;
  94.   default:
  95. if (node.childNodes[i].tagName && node.childNodes[i].tagName.toLowerCase() == "br") {
  96. result += "n";
  97. } else {
  98. result += dojo.html.renderedTextContent(node.childNodes[i]);
  99. }
  100. break;
  101. }
  102. break;
  103.   case 3:
  104.   case 2:
  105.   case 4:
  106. var text = node.childNodes[i].nodeValue;
  107. var textTransform = "unknown";
  108. try {
  109. textTransform = dojo.html.getStyle(node, "text-transform");
  110. }
  111. catch (E) {
  112. }
  113. switch (textTransform) {
  114.   case "capitalize":
  115. var words = text.split(" ");
  116. for (var i = 0; i < words.length; i++) {
  117. words[i] = words[i].charAt(0).toUpperCase() + words[i].substring(1);
  118. }
  119. text = words.join(" ");
  120. break;
  121.   case "uppercase":
  122. text = text.toUpperCase();
  123. break;
  124.   case "lowercase":
  125. text = text.toLowerCase();
  126. break;
  127.   default:
  128. break;
  129. }
  130. switch (textTransform) {
  131.   case "nowrap":
  132. break;
  133.   case "pre-wrap":
  134. break;
  135.   case "pre-line":
  136. break;
  137.   case "pre":
  138. break;
  139.   default:
  140. text = text.replace(/s+/, " ");
  141. if (/s$/.test(result)) {
  142. text.replace(/^s/, "");
  143. }
  144. break;
  145. }
  146. result += text;
  147. break;
  148.   default:
  149. break;
  150. }
  151. }
  152. return result;
  153. };
  154. dojo.html.createNodesFromText = function (txt, trim) {
  155. if (trim) {
  156. txt = txt.replace(/^s+|s+$/g, "");
  157. }
  158. var tn = dojo.doc().createElement("div");
  159. tn.style.visibility = "hidden";
  160. dojo.body().appendChild(tn);
  161. var tableType = "none";
  162. if ((/^<t[dh][srn>]/i).test(txt.replace(/^s+/))) {
  163. txt = "<table><tbody><tr>" + txt + "</tr></tbody></table>";
  164. tableType = "cell";
  165. } else {
  166. if ((/^<tr[srn>]/i).test(txt.replace(/^s+/))) {
  167. txt = "<table><tbody>" + txt + "</tbody></table>";
  168. tableType = "row";
  169. } else {
  170. if ((/^<(thead|tbody|tfoot)[srn>]/i).test(txt.replace(/^s+/))) {
  171. txt = "<table>" + txt + "</table>";
  172. tableType = "section";
  173. }
  174. }
  175. }
  176. tn.innerHTML = txt;
  177. if (tn["normalize"]) {
  178. tn.normalize();
  179. }
  180. var parent = null;
  181. switch (tableType) {
  182.   case "cell":
  183. parent = tn.getElementsByTagName("tr")[0];
  184. break;
  185.   case "row":
  186. parent = tn.getElementsByTagName("tbody")[0];
  187. break;
  188.   case "section":
  189. parent = tn.getElementsByTagName("table")[0];
  190. break;
  191.   default:
  192. parent = tn;
  193. break;
  194. }
  195. var nodes = [];
  196. for (var x = 0; x < parent.childNodes.length; x++) {
  197. nodes.push(parent.childNodes[x].cloneNode(true));
  198. }
  199. tn.style.display = "none";
  200. dojo.html.destroyNode(tn);
  201. return nodes;
  202. };
  203. dojo.html.placeOnScreen = function (node, desiredX, desiredY, padding, hasScroll, corners, tryOnly) {
  204. if (desiredX instanceof Array || typeof desiredX == "array") {
  205. tryOnly = corners;
  206. corners = hasScroll;
  207. hasScroll = padding;
  208. padding = desiredY;
  209. desiredY = desiredX[1];
  210. desiredX = desiredX[0];
  211. }
  212. if (corners instanceof String || typeof corners == "string") {
  213. corners = corners.split(",");
  214. }
  215. if (!isNaN(padding)) {
  216. padding = [Number(padding), Number(padding)];
  217. } else {
  218. if (!(padding instanceof Array || typeof padding == "array")) {
  219. padding = [0, 0];
  220. }
  221. }
  222. var scroll = dojo.html.getScroll().offset;
  223. var view = dojo.html.getViewport();
  224. node = dojo.byId(node);
  225. var oldDisplay = node.style.display;
  226. node.style.display = "";
  227. var bb = dojo.html.getBorderBox(node);
  228. var w = bb.width;
  229. var h = bb.height;
  230. node.style.display = oldDisplay;
  231. if (!(corners instanceof Array || typeof corners == "array")) {
  232. corners = ["TL"];
  233. }
  234. var bestx, besty, bestDistance = Infinity, bestCorner;
  235. for (var cidex = 0; cidex < corners.length; ++cidex) {
  236. var corner = corners[cidex];
  237. var match = true;
  238. var tryX = desiredX - (corner.charAt(1) == "L" ? 0 : w) + padding[0] * (corner.charAt(1) == "L" ? 1 : -1);
  239. var tryY = desiredY - (corner.charAt(0) == "T" ? 0 : h) + padding[1] * (corner.charAt(0) == "T" ? 1 : -1);
  240. if (hasScroll) {
  241. tryX -= scroll.x;
  242. tryY -= scroll.y;
  243. }
  244. if (tryX < 0) {
  245. tryX = 0;
  246. match = false;
  247. }
  248. if (tryY < 0) {
  249. tryY = 0;
  250. match = false;
  251. }
  252. var x = tryX + w;
  253. if (x > view.width) {
  254. x = view.width - w;
  255. match = false;
  256. } else {
  257. x = tryX;
  258. }
  259. x = Math.max(padding[0], x) + scroll.x;
  260. var y = tryY + h;
  261. if (y > view.height) {
  262. y = view.height - h;
  263. match = false;
  264. } else {
  265. y = tryY;
  266. }
  267. y = Math.max(padding[1], y) + scroll.y;
  268. if (match) {
  269. bestx = x;
  270. besty = y;
  271. bestDistance = 0;
  272. bestCorner = corner;
  273. break;
  274. } else {
  275. var dist = Math.pow(x - tryX - scroll.x, 2) + Math.pow(y - tryY - scroll.y, 2);
  276. if (bestDistance > dist) {
  277. bestDistance = dist;
  278. bestx = x;
  279. besty = y;
  280. bestCorner = corner;
  281. }
  282. }
  283. }
  284. if (!tryOnly) {
  285. node.style.left = bestx + "px";
  286. node.style.top = besty + "px";
  287. }
  288. return {left:bestx, top:besty, x:bestx, y:besty, dist:bestDistance, corner:bestCorner};
  289. };
  290. dojo.html.placeOnScreenPoint = function (node, desiredX, desiredY, padding, hasScroll) {
  291. dojo.deprecated("dojo.html.placeOnScreenPoint", "use dojo.html.placeOnScreen() instead", "0.5");
  292. return dojo.html.placeOnScreen(node, desiredX, desiredY, padding, hasScroll, ["TL", "TR", "BL", "BR"]);
  293. };
  294. dojo.html.placeOnScreenAroundElement = function (node, aroundNode, padding, aroundType, aroundCorners, tryOnly) {
  295. var best, bestDistance = Infinity;
  296. aroundNode = dojo.byId(aroundNode);
  297. var oldDisplay = aroundNode.style.display;
  298. aroundNode.style.display = "";
  299. var mb = dojo.html.getElementBox(aroundNode, aroundType);
  300. var aroundNodeW = mb.width;
  301. var aroundNodeH = mb.height;
  302. var aroundNodePos = dojo.html.getAbsolutePosition(aroundNode, true, aroundType);
  303. aroundNode.style.display = oldDisplay;
  304. for (var nodeCorner in aroundCorners) {
  305. var pos, desiredX, desiredY;
  306. var corners = aroundCorners[nodeCorner];
  307. desiredX = aroundNodePos.x + (nodeCorner.charAt(1) == "L" ? 0 : aroundNodeW);
  308. desiredY = aroundNodePos.y + (nodeCorner.charAt(0) == "T" ? 0 : aroundNodeH);
  309. pos = dojo.html.placeOnScreen(node, desiredX, desiredY, padding, true, corners, true);
  310. if (pos.dist == 0) {
  311. best = pos;
  312. break;
  313. } else {
  314. if (bestDistance > pos.dist) {
  315. bestDistance = pos.dist;
  316. best = pos;
  317. }
  318. }
  319. }
  320. if (!tryOnly) {
  321. node.style.left = best.left + "px";
  322. node.style.top = best.top + "px";
  323. }
  324. return best;
  325. };
  326. dojo.html.scrollIntoView = function (node) {
  327. if (!node) {
  328. return;
  329. }
  330. if (dojo.render.html.ie) {
  331. if (dojo.html.getBorderBox(node.parentNode).height <= node.parentNode.scrollHeight) {
  332. node.scrollIntoView(false);
  333. }
  334. } else {
  335. if (dojo.render.html.mozilla) {
  336. node.scrollIntoView(false);
  337. } else {
  338. var parent = node.parentNode;
  339. var parentBottom = parent.scrollTop + dojo.html.getBorderBox(parent).height;
  340. var nodeBottom = node.offsetTop + dojo.html.getMarginBox(node).height;
  341. if (parentBottom < nodeBottom) {
  342. parent.scrollTop += (nodeBottom - parentBottom);
  343. } else {
  344. if (parent.scrollTop > node.offsetTop) {
  345. parent.scrollTop -= (parent.scrollTop - node.offsetTop);
  346. }
  347. }
  348. }
  349. }
  350. };