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

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.behavior");
  9. dojo.require("dojo.event.*");
  10. dojo.require("dojo.experimental");
  11. dojo.experimental("dojo.behavior");
  12. dojo.behavior = new function () {
  13. function arrIn(obj, name) {
  14. if (!obj[name]) {
  15. obj[name] = [];
  16. }
  17. return obj[name];
  18. }
  19. function forIn(obj, scope, func) {
  20. var tmpObj = {};
  21. for (var x in obj) {
  22. if (typeof tmpObj[x] == "undefined") {
  23. if (!func) {
  24. scope(obj[x], x);
  25. } else {
  26. func.call(scope, obj[x], x);
  27. }
  28. }
  29. }
  30. }
  31. this.behaviors = {};
  32. this.add = function (behaviorObj) {
  33. var tmpObj = {};
  34. forIn(behaviorObj, this, function (behavior, name) {
  35. var tBehavior = arrIn(this.behaviors, name);
  36. if ((dojo.lang.isString(behavior)) || (dojo.lang.isFunction(behavior))) {
  37. behavior = {found:behavior};
  38. }
  39. forIn(behavior, function (rule, ruleName) {
  40. arrIn(tBehavior, ruleName).push(rule);
  41. });
  42. });
  43. };
  44. this.apply = function () {
  45. dojo.profile.start("dojo.behavior.apply");
  46. var r = dojo.render.html;
  47. var safariGoodEnough = (!r.safari);
  48. if (r.safari) {
  49. var uas = r.UA.split("AppleWebKit/")[1];
  50. if (parseInt(uas.match(/[0-9.]{3,}/)) >= 420) {
  51. safariGoodEnough = true;
  52. }
  53. }
  54. if ((dj_undef("behaviorFastParse", djConfig) ? (safariGoodEnough) : djConfig["behaviorFastParse"])) {
  55. this.applyFast();
  56. } else {
  57. this.applySlow();
  58. }
  59. dojo.profile.end("dojo.behavior.apply");
  60. };
  61. this.matchCache = {};
  62. this.elementsById = function (id, handleRemoved) {
  63. var removed = [];
  64. var added = [];
  65. arrIn(this.matchCache, id);
  66. if (handleRemoved) {
  67. var nodes = this.matchCache[id];
  68. for (var x = 0; x < nodes.length; x++) {
  69. if (nodes[x].id != "") {
  70. removed.push(nodes[x]);
  71. nodes.splice(x, 1);
  72. x--;
  73. }
  74. }
  75. }
  76. var tElem = dojo.byId(id);
  77. while (tElem) {
  78. if (!tElem["idcached"]) {
  79. added.push(tElem);
  80. }
  81. tElem.id = "";
  82. tElem = dojo.byId(id);
  83. }
  84. this.matchCache[id] = this.matchCache[id].concat(added);
  85. dojo.lang.forEach(this.matchCache[id], function (node) {
  86. node.id = id;
  87. node.idcached = true;
  88. });
  89. return {"removed":removed, "added":added, "match":this.matchCache[id]};
  90. };
  91. this.applyToNode = function (node, action, ruleSetName) {
  92. if (typeof action == "string") {
  93. dojo.event.topic.registerPublisher(action, node, ruleSetName);
  94. } else {
  95. if (typeof action == "function") {
  96. if (ruleSetName == "found") {
  97. action(node);
  98. } else {
  99. dojo.event.connect(node, ruleSetName, action);
  100. }
  101. } else {
  102. action.srcObj = node;
  103. action.srcFunc = ruleSetName;
  104. dojo.event.kwConnect(action);
  105. }
  106. }
  107. };
  108. this.applyFast = function () {
  109. dojo.profile.start("dojo.behavior.applyFast");
  110. forIn(this.behaviors, function (tBehavior, id) {
  111. var elems = dojo.behavior.elementsById(id);
  112. dojo.lang.forEach(elems.added, function (elem) {
  113. forIn(tBehavior, function (ruleSet, ruleSetName) {
  114. if (dojo.lang.isArray(ruleSet)) {
  115. dojo.lang.forEach(ruleSet, function (action) {
  116. dojo.behavior.applyToNode(elem, action, ruleSetName);
  117. });
  118. }
  119. });
  120. });
  121. });
  122. dojo.profile.end("dojo.behavior.applyFast");
  123. };
  124. this.applySlow = function () {
  125. dojo.profile.start("dojo.behavior.applySlow");
  126. var all = document.getElementsByTagName("*");
  127. var allLen = all.length;
  128. for (var x = 0; x < allLen; x++) {
  129. var elem = all[x];
  130. if ((elem.id) && (!elem["behaviorAdded"]) && (this.behaviors[elem.id])) {
  131. elem["behaviorAdded"] = true;
  132. forIn(this.behaviors[elem.id], function (ruleSet, ruleSetName) {
  133. if (dojo.lang.isArray(ruleSet)) {
  134. dojo.lang.forEach(ruleSet, function (action) {
  135. dojo.behavior.applyToNode(elem, action, ruleSetName);
  136. });
  137. }
  138. });
  139. }
  140. }
  141. dojo.profile.end("dojo.behavior.applySlow");
  142. };
  143. };
  144. dojo.addOnLoad(dojo.behavior, "apply");