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

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.lfx.html");
  9. dojo.require("dojo.gfx.color");
  10. dojo.require("dojo.lfx.Animation");
  11. dojo.require("dojo.lang.array");
  12. dojo.require("dojo.html.display");
  13. dojo.require("dojo.html.color");
  14. dojo.require("dojo.html.layout");
  15. dojo.lfx.html._byId = function (nodes) {
  16. if (!nodes) {
  17. return [];
  18. }
  19. if (dojo.lang.isArrayLike(nodes)) {
  20. if (!nodes.alreadyChecked) {
  21. var n = [];
  22. dojo.lang.forEach(nodes, function (node) {
  23. n.push(dojo.byId(node));
  24. });
  25. n.alreadyChecked = true;
  26. return n;
  27. } else {
  28. return nodes;
  29. }
  30. } else {
  31. var n = [];
  32. n.push(dojo.byId(nodes));
  33. n.alreadyChecked = true;
  34. return n;
  35. }
  36. };
  37. dojo.lfx.html.propertyAnimation = function (nodes, propertyMap, duration, easing, handlers) {
  38. nodes = dojo.lfx.html._byId(nodes);
  39. var targs = {"propertyMap":propertyMap, "nodes":nodes, "duration":duration, "easing":easing || dojo.lfx.easeDefault};
  40. var setEmUp = function (args) {
  41. if (args.nodes.length == 1) {
  42. var pm = args.propertyMap;
  43. if (!dojo.lang.isArray(args.propertyMap)) {
  44. var parr = [];
  45. for (var pname in pm) {
  46. pm[pname].property = pname;
  47. parr.push(pm[pname]);
  48. }
  49. pm = args.propertyMap = parr;
  50. }
  51. dojo.lang.forEach(pm, function (prop) {
  52. if (dj_undef("start", prop)) {
  53. if (prop.property != "opacity") {
  54. prop.start = parseInt(dojo.html.getComputedStyle(args.nodes[0], prop.property));
  55. } else {
  56. prop.start = dojo.html.getOpacity(args.nodes[0]);
  57. }
  58. }
  59. });
  60. }
  61. };
  62. var coordsAsInts = function (coords) {
  63. var cints = [];
  64. dojo.lang.forEach(coords, function (c) {
  65. cints.push(Math.round(c));
  66. });
  67. return cints;
  68. };
  69. var setStyle = function (n, style) {
  70. n = dojo.byId(n);
  71. if (!n || !n.style) {
  72. return;
  73. }
  74. for (var s in style) {
  75. try {
  76. if (s == "opacity") {
  77. dojo.html.setOpacity(n, style[s]);
  78. } else {
  79. n.style[s] = style[s];
  80. }
  81. }
  82. catch (e) {
  83. dojo.debug(e);
  84. }
  85. }
  86. };
  87. var propLine = function (properties) {
  88. this._properties = properties;
  89. this.diffs = new Array(properties.length);
  90. dojo.lang.forEach(properties, function (prop, i) {
  91. if (dojo.lang.isFunction(prop.start)) {
  92. prop.start = prop.start(prop, i);
  93. }
  94. if (dojo.lang.isFunction(prop.end)) {
  95. prop.end = prop.end(prop, i);
  96. }
  97. if (dojo.lang.isArray(prop.start)) {
  98. this.diffs[i] = null;
  99. } else {
  100. if (prop.start instanceof dojo.gfx.color.Color) {
  101. prop.startRgb = prop.start.toRgb();
  102. prop.endRgb = prop.end.toRgb();
  103. } else {
  104. this.diffs[i] = prop.end - prop.start;
  105. }
  106. }
  107. }, this);
  108. this.getValue = function (n) {
  109. var ret = {};
  110. dojo.lang.forEach(this._properties, function (prop, i) {
  111. var value = null;
  112. if (dojo.lang.isArray(prop.start)) {
  113. } else {
  114. if (prop.start instanceof dojo.gfx.color.Color) {
  115. value = (prop.units || "rgb") + "(";
  116. for (var j = 0; j < prop.startRgb.length; j++) {
  117. value += Math.round(((prop.endRgb[j] - prop.startRgb[j]) * n) + prop.startRgb[j]) + (j < prop.startRgb.length - 1 ? "," : "");
  118. }
  119. value += ")";
  120. } else {
  121. value = ((this.diffs[i]) * n) + prop.start + (prop.property != "opacity" ? prop.units || "px" : "");
  122. }
  123. }
  124. ret[dojo.html.toCamelCase(prop.property)] = value;
  125. }, this);
  126. return ret;
  127. };
  128. };
  129. var anim = new dojo.lfx.Animation({beforeBegin:function () {
  130. setEmUp(targs);
  131. anim.curve = new propLine(targs.propertyMap);
  132. }, onAnimate:function (propValues) {
  133. dojo.lang.forEach(targs.nodes, function (node) {
  134. setStyle(node, propValues);
  135. });
  136. }}, targs.duration, null, targs.easing);
  137. if (handlers) {
  138. for (var x in handlers) {
  139. if (dojo.lang.isFunction(handlers[x])) {
  140. anim.connect(x, anim, handlers[x]);
  141. }
  142. }
  143. }
  144. return anim;
  145. };
  146. dojo.lfx.html._makeFadeable = function (nodes) {
  147. var makeFade = function (node) {
  148. if (dojo.render.html.ie) {
  149. if ((node.style.zoom.length == 0) && (dojo.html.getStyle(node, "zoom") == "normal")) {
  150. node.style.zoom = "1";
  151. }
  152. if ((node.style.width.length == 0) && (dojo.html.getStyle(node, "width") == "auto")) {
  153. node.style.width = "auto";
  154. }
  155. }
  156. };
  157. if (dojo.lang.isArrayLike(nodes)) {
  158. dojo.lang.forEach(nodes, makeFade);
  159. } else {
  160. makeFade(nodes);
  161. }
  162. };
  163. dojo.lfx.html.fade = function (nodes, values, duration, easing, callback) {
  164. nodes = dojo.lfx.html._byId(nodes);
  165. var props = {property:"opacity"};
  166. if (!dj_undef("start", values)) {
  167. props.start = values.start;
  168. } else {
  169. props.start = function () {
  170. return dojo.html.getOpacity(nodes[0]);
  171. };
  172. }
  173. if (!dj_undef("end", values)) {
  174. props.end = values.end;
  175. } else {
  176. dojo.raise("dojo.lfx.html.fade needs an end value");
  177. }
  178. var anim = dojo.lfx.propertyAnimation(nodes, [props], duration, easing);
  179. anim.connect("beforeBegin", function () {
  180. dojo.lfx.html._makeFadeable(nodes);
  181. });
  182. if (callback) {
  183. anim.connect("onEnd", function () {
  184. callback(nodes, anim);
  185. });
  186. }
  187. return anim;
  188. };
  189. dojo.lfx.html.fadeIn = function (nodes, duration, easing, callback) {
  190. return dojo.lfx.html.fade(nodes, {end:1}, duration, easing, callback);
  191. };
  192. dojo.lfx.html.fadeOut = function (nodes, duration, easing, callback) {
  193. return dojo.lfx.html.fade(nodes, {end:0}, duration, easing, callback);
  194. };
  195. dojo.lfx.html.fadeShow = function (nodes, duration, easing, callback) {
  196. nodes = dojo.lfx.html._byId(nodes);
  197. dojo.lang.forEach(nodes, function (node) {
  198. dojo.html.setOpacity(node, 0);
  199. });
  200. var anim = dojo.lfx.html.fadeIn(nodes, duration, easing, callback);
  201. anim.connect("beforeBegin", function () {
  202. if (dojo.lang.isArrayLike(nodes)) {
  203. dojo.lang.forEach(nodes, dojo.html.show);
  204. } else {
  205. dojo.html.show(nodes);
  206. }
  207. });
  208. return anim;
  209. };
  210. dojo.lfx.html.fadeHide = function (nodes, duration, easing, callback) {
  211. var anim = dojo.lfx.html.fadeOut(nodes, duration, easing, function () {
  212. if (dojo.lang.isArrayLike(nodes)) {
  213. dojo.lang.forEach(nodes, dojo.html.hide);
  214. } else {
  215. dojo.html.hide(nodes);
  216. }
  217. if (callback) {
  218. callback(nodes, anim);
  219. }
  220. });
  221. return anim;
  222. };
  223. dojo.lfx.html.wipeIn = function (nodes, duration, easing, callback) {
  224. nodes = dojo.lfx.html._byId(nodes);
  225. var anims = [];
  226. dojo.lang.forEach(nodes, function (node) {
  227. var oprop = {};
  228. var origTop, origLeft, origPosition;
  229. with (node.style) {
  230. origTop = top;
  231. origLeft = left;
  232. origPosition = position;
  233. top = "-9999px";
  234. left = "-9999px";
  235. position = "absolute";
  236. display = "";
  237. }
  238. var nodeHeight = dojo.html.getBorderBox(node).height;
  239. with (node.style) {
  240. top = origTop;
  241. left = origLeft;
  242. position = origPosition;
  243. display = "none";
  244. }
  245. var anim = dojo.lfx.propertyAnimation(node, {"height":{start:1, end:function () {
  246. return nodeHeight;
  247. }}}, duration, easing);
  248. anim.connect("beforeBegin", function () {
  249. oprop.overflow = node.style.overflow;
  250. oprop.height = node.style.height;
  251. with (node.style) {
  252. overflow = "hidden";
  253. height = "1px";
  254. }
  255. dojo.html.show(node);
  256. });
  257. anim.connect("onEnd", function () {
  258. with (node.style) {
  259. overflow = oprop.overflow;
  260. height = oprop.height;
  261. }
  262. if (callback) {
  263. callback(node, anim);
  264. }
  265. });
  266. anims.push(anim);
  267. });
  268. return dojo.lfx.combine(anims);
  269. };
  270. dojo.lfx.html.wipeOut = function (nodes, duration, easing, callback) {
  271. nodes = dojo.lfx.html._byId(nodes);
  272. var anims = [];
  273. dojo.lang.forEach(nodes, function (node) {
  274. var oprop = {};
  275. var anim = dojo.lfx.propertyAnimation(node, {"height":{start:function () {
  276. return dojo.html.getContentBox(node).height;
  277. }, end:1}}, duration, easing, {"beforeBegin":function () {
  278. oprop.overflow = node.style.overflow;
  279. oprop.height = node.style.height;
  280. with (node.style) {
  281. overflow = "hidden";
  282. }
  283. dojo.html.show(node);
  284. }, "onEnd":function () {
  285. dojo.html.hide(node);
  286. with (node.style) {
  287. overflow = oprop.overflow;
  288. height = oprop.height;
  289. }
  290. if (callback) {
  291. callback(node, anim);
  292. }
  293. }});
  294. anims.push(anim);
  295. });
  296. return dojo.lfx.combine(anims);
  297. };
  298. dojo.lfx.html.slideTo = function (nodes, coords, duration, easing, callback) {
  299. nodes = dojo.lfx.html._byId(nodes);
  300. var anims = [];
  301. var compute = dojo.html.getComputedStyle;
  302. if (dojo.lang.isArray(coords)) {
  303. dojo.deprecated("dojo.lfx.html.slideTo(node, array)", "use dojo.lfx.html.slideTo(node, {top: value, left: value});", "0.5");
  304. coords = {top:coords[0], left:coords[1]};
  305. }
  306. dojo.lang.forEach(nodes, function (node) {
  307. var top = null;
  308. var left = null;
  309. var init = (function () {
  310. var innerNode = node;
  311. return function () {
  312. var pos = compute(innerNode, "position");
  313. top = (pos == "absolute" ? node.offsetTop : parseInt(compute(node, "top")) || 0);
  314. left = (pos == "absolute" ? node.offsetLeft : parseInt(compute(node, "left")) || 0);
  315. if (!dojo.lang.inArray(["absolute", "relative"], pos)) {
  316. var ret = dojo.html.abs(innerNode, true);
  317. dojo.html.setStyleAttributes(innerNode, "position:absolute;top:" + ret.y + "px;left:" + ret.x + "px;");
  318. top = ret.y;
  319. left = ret.x;
  320. }
  321. };
  322. })();
  323. init();
  324. var anim = dojo.lfx.propertyAnimation(node, {"top":{start:top, end:(coords.top || 0)}, "left":{start:left, end:(coords.left || 0)}}, duration, easing, {"beforeBegin":init});
  325. if (callback) {
  326. anim.connect("onEnd", function () {
  327. callback(nodes, anim);
  328. });
  329. }
  330. anims.push(anim);
  331. });
  332. return dojo.lfx.combine(anims);
  333. };
  334. dojo.lfx.html.slideBy = function (nodes, coords, duration, easing, callback) {
  335. nodes = dojo.lfx.html._byId(nodes);
  336. var anims = [];
  337. var compute = dojo.html.getComputedStyle;
  338. if (dojo.lang.isArray(coords)) {
  339. dojo.deprecated("dojo.lfx.html.slideBy(node, array)", "use dojo.lfx.html.slideBy(node, {top: value, left: value});", "0.5");
  340. coords = {top:coords[0], left:coords[1]};
  341. }
  342. dojo.lang.forEach(nodes, function (node) {
  343. var top = null;
  344. var left = null;
  345. var init = (function () {
  346. var innerNode = node;
  347. return function () {
  348. var pos = compute(innerNode, "position");
  349. top = (pos == "absolute" ? node.offsetTop : parseInt(compute(node, "top")) || 0);
  350. left = (pos == "absolute" ? node.offsetLeft : parseInt(compute(node, "left")) || 0);
  351. if (!dojo.lang.inArray(["absolute", "relative"], pos)) {
  352. var ret = dojo.html.abs(innerNode, true);
  353. dojo.html.setStyleAttributes(innerNode, "position:absolute;top:" + ret.y + "px;left:" + ret.x + "px;");
  354. top = ret.y;
  355. left = ret.x;
  356. }
  357. };
  358. })();
  359. init();
  360. var anim = dojo.lfx.propertyAnimation(node, {"top":{start:top, end:top + (coords.top || 0)}, "left":{start:left, end:left + (coords.left || 0)}}, duration, easing).connect("beforeBegin", init);
  361. if (callback) {
  362. anim.connect("onEnd", function () {
  363. callback(nodes, anim);
  364. });
  365. }
  366. anims.push(anim);
  367. });
  368. return dojo.lfx.combine(anims);
  369. };
  370. dojo.lfx.html.explode = function (start, endNode, duration, easing, callback) {
  371. var h = dojo.html;
  372. start = dojo.byId(start);
  373. endNode = dojo.byId(endNode);
  374. var startCoords = h.toCoordinateObject(start, true);
  375. var outline = document.createElement("div");
  376. h.copyStyle(outline, endNode);
  377. if (endNode.explodeClassName) {
  378. outline.className = endNode.explodeClassName;
  379. }
  380. with (outline.style) {
  381. position = "absolute";
  382. display = "none";
  383. var backgroundStyle = h.getStyle(start, "background-color");
  384. backgroundColor = backgroundStyle ? backgroundStyle.toLowerCase() : "transparent";
  385. backgroundColor = (backgroundColor == "transparent") ? "rgb(221, 221, 221)" : backgroundColor;
  386. }
  387. dojo.body().appendChild(outline);
  388. with (endNode.style) {
  389. visibility = "hidden";
  390. display = "block";
  391. }
  392. var endCoords = h.toCoordinateObject(endNode, true);
  393. with (endNode.style) {
  394. display = "none";
  395. visibility = "visible";
  396. }
  397. var props = {opacity:{start:0.5, end:1}};
  398. dojo.lang.forEach(["height", "width", "top", "left"], function (type) {
  399. props[type] = {start:startCoords[type], end:endCoords[type]};
  400. });
  401. var anim = new dojo.lfx.propertyAnimation(outline, props, duration, easing, {"beforeBegin":function () {
  402. h.setDisplay(outline, "block");
  403. }, "onEnd":function () {
  404. h.setDisplay(endNode, "block");
  405. outline.parentNode.removeChild(outline);
  406. }});
  407. if (callback) {
  408. anim.connect("onEnd", function () {
  409. callback(endNode, anim);
  410. });
  411. }
  412. return anim;
  413. };
  414. dojo.lfx.html.implode = function (startNode, end, duration, easing, callback) {
  415. var h = dojo.html;
  416. startNode = dojo.byId(startNode);
  417. end = dojo.byId(end);
  418. var startCoords = dojo.html.toCoordinateObject(startNode, true);
  419. var endCoords = dojo.html.toCoordinateObject(end, true);
  420. var outline = document.createElement("div");
  421. dojo.html.copyStyle(outline, startNode);
  422. if (startNode.explodeClassName) {
  423. outline.className = startNode.explodeClassName;
  424. }
  425. dojo.html.setOpacity(outline, 0.3);
  426. with (outline.style) {
  427. position = "absolute";
  428. display = "none";
  429. backgroundColor = h.getStyle(startNode, "background-color").toLowerCase();
  430. }
  431. dojo.body().appendChild(outline);
  432. var props = {opacity:{start:1, end:0.5}};
  433. dojo.lang.forEach(["height", "width", "top", "left"], function (type) {
  434. props[type] = {start:startCoords[type], end:endCoords[type]};
  435. });
  436. var anim = new dojo.lfx.propertyAnimation(outline, props, duration, easing, {"beforeBegin":function () {
  437. dojo.html.hide(startNode);
  438. dojo.html.show(outline);
  439. }, "onEnd":function () {
  440. outline.parentNode.removeChild(outline);
  441. }});
  442. if (callback) {
  443. anim.connect("onEnd", function () {
  444. callback(startNode, anim);
  445. });
  446. }
  447. return anim;
  448. };
  449. dojo.lfx.html.highlight = function (nodes, startColor, duration, easing, callback) {
  450. nodes = dojo.lfx.html._byId(nodes);
  451. var anims = [];
  452. dojo.lang.forEach(nodes, function (node) {
  453. var color = dojo.html.getBackgroundColor(node);
  454. var bg = dojo.html.getStyle(node, "background-color").toLowerCase();
  455. var bgImage = dojo.html.getStyle(node, "background-image");
  456. var wasTransparent = (bg == "transparent" || bg == "rgba(0, 0, 0, 0)");
  457. while (color.length > 3) {
  458. color.pop();
  459. }
  460. var rgb = new dojo.gfx.color.Color(startColor);
  461. var endRgb = new dojo.gfx.color.Color(color);
  462. var anim = dojo.lfx.propertyAnimation(node, {"background-color":{start:rgb, end:endRgb}}, duration, easing, {"beforeBegin":function () {
  463. if (bgImage) {
  464. node.style.backgroundImage = "none";
  465. }
  466. node.style.backgroundColor = "rgb(" + rgb.toRgb().join(",") + ")";
  467. }, "onEnd":function () {
  468. if (bgImage) {
  469. node.style.backgroundImage = bgImage;
  470. }
  471. if (wasTransparent) {
  472. node.style.backgroundColor = "transparent";
  473. }
  474. if (callback) {
  475. callback(node, anim);
  476. }
  477. }});
  478. anims.push(anim);
  479. });
  480. return dojo.lfx.combine(anims);
  481. };
  482. dojo.lfx.html.unhighlight = function (nodes, endColor, duration, easing, callback) {
  483. nodes = dojo.lfx.html._byId(nodes);
  484. var anims = [];
  485. dojo.lang.forEach(nodes, function (node) {
  486. var color = new dojo.gfx.color.Color(dojo.html.getBackgroundColor(node));
  487. var rgb = new dojo.gfx.color.Color(endColor);
  488. var bgImage = dojo.html.getStyle(node, "background-image");
  489. var anim = dojo.lfx.propertyAnimation(node, {"background-color":{start:color, end:rgb}}, duration, easing, {"beforeBegin":function () {
  490. if (bgImage) {
  491. node.style.backgroundImage = "none";
  492. }
  493. node.style.backgroundColor = "rgb(" + color.toRgb().join(",") + ")";
  494. }, "onEnd":function () {
  495. if (callback) {
  496. callback(node, anim);
  497. }
  498. }});
  499. anims.push(anim);
  500. });
  501. return dojo.lfx.combine(anims);
  502. };
  503. dojo.lang.mixin(dojo.lfx, dojo.lfx.html);