Нет описания

TreeGrid.js 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. TreeGrid = function (_config) {
  2. _config = _config || {};
  3. var s = "";
  4. var rownum = 0;
  5. var __root;
  6. var __selectedData = null;
  7. var __selectedId = null;
  8. var __selectedIndex = null;
  9. var folderOpenIcon = (_config.folderOpenIcon || TreeGrid.FOLDER_OPEN_ICON);
  10. var folderCloseIcon = (_config.folderCloseIcon || TreeGrid.FOLDER_CLOSE_ICON);
  11. var defaultLeafIcon = (_config.defaultLeafIcon || TreeGrid.DEFAULT_LEAF_ICON);
  12. //显示表头行
  13. drowHeader = function () {
  14. s += "<thead><tr class='header'id='header' height='" + (_config.headerHeight || "25") + "'>";
  15. var cols = _config.columns;
  16. for (i = 0; i < cols.length; i++) {
  17. var col = cols[i];
  18. s += "<th align='" + (col.headerAlign || _config.headerAlign || "center") + "' width='" + (col.width || "") + "'><div class='th-inner '>" + (col.headerText || "") + "</div></th>";
  19. }
  20. s += "</tr></thead>";
  21. }
  22. //递归显示数据行
  23. drowData = function () {
  24. var rows = _config.data;
  25. var cols = _config.columns;
  26. drowRowData(rows, cols, 1, "");
  27. }
  28. //局部变量i、j必须要用 var 来声明,否则,后续的数据无法正常显示
  29. drowRowData = function (_rows, _cols, _level, _pid) {
  30. var op = "Y"
  31. var folderColumnIndex = (_config.folderColumnIndex || 0);
  32. for (var i = 0; i < _rows.length; i++) {
  33. var id = _pid + "_" + i; //行id
  34. var row = _rows[i];
  35. s += "<tr id='TR" + id + "' pid='" + ((_pid == "") ? "" : ("TR" + _pid)) + "' open='Y' data=\"" + TreeGrid.json2str(row) + "\" rowIndex='" + rownum++ + "'>";
  36. for (var j = 0; j < _cols.length; j++) {
  37. var col = _cols[j];
  38. s += "<td align='" + (col.dataAlign || _config.dataAlign || "left") + "'";
  39. //层次缩进
  40. if (j == folderColumnIndex) {
  41. s += " style='text-indent:" + (parseInt((_config.indentation || "20")) * (_level - 1)) + "px;'> ";
  42. } else {
  43. s += ">";
  44. }
  45. //节点图标
  46. if (j == folderColumnIndex) {
  47. if (row.children != "") { //有下级数据
  48. s += "<img folder='Y' op='" + op + "' name='imgid' id='" + row.P_ID + "' trid='TR" + id + "' src='" + folderOpenIcon + "' class='image_hand'><i></i>";
  49. } else {
  50. s += "<img src='" + defaultLeafIcon + "' class='image_nohand'><i></i>";
  51. }
  52. }
  53. //单元格内容
  54. if (col.handler) {
  55. s += (eval(col.handler + ".call(new Object(), row, col)") || "") + "</td>";
  56. } else {
  57. s += (row[col.dataField] || "") + "</td>";
  58. }
  59. }
  60. s += "</tr>";
  61. //递归显示下级数据
  62. if (row.children) {
  63. drowRowData(row.children, _cols, _level + 1, id);
  64. }
  65. }
  66. }
  67. //主函数
  68. this.show = function () {
  69. this.id = _config.id || ("TreeGrid" + TreeGrid.COUNT++);
  70. s += "<table id='" + this.id + "' cellspacing=0 cellpadding=0 width='" + (_config.width || "100%") + "' class='TreeGrid table table-hover table-striped'>";
  71. drowHeader();
  72. drowData();
  73. s += "</table>";
  74. __root = jQuery("#" + _config.renderTo);
  75. __root.append(s);
  76. //初始化动作
  77. init();
  78. }
  79. init = function () {
  80. //以新背景色标识鼠标所指行
  81. if ((_config.hoverRowBackground || "false") == "true") {
  82. __root.find("tr").hover(
  83. function () {
  84. if (jQuery(this).attr("class") && jQuery(this).attr("class") == "header") return;
  85. jQuery(this).addClass("row_hover");
  86. },
  87. function () {
  88. jQuery(this).removeClass("row_hover");
  89. }
  90. );
  91. }
  92. //将单击事件绑定到tr标签
  93. __root.find("tr").bind("click", function () {
  94. __root.find("tr").removeClass("row_active");
  95. jQuery(this).addClass("row_active");
  96. //获取当前行的数据
  97. __selectedData = this.data || this.getAttribute("data");
  98. __selectedId = this.id || this.getAttribute("id");
  99. __selectedIndex = this.rownum || this.getAttribute("rowIndex");
  100. //行记录单击后触发的事件
  101. if (_config.itemClick) {
  102. eval(_config.itemClick + "(__selectedId, __selectedIndex, TreeGrid.str2json(__selectedData))");
  103. }
  104. });
  105. //展开、关闭下级节点
  106. __root.find("img[folder='Y']").bind("click", function () {
  107. var trid = this.trid || this.getAttribute("trid");
  108. var id = this.id || this.getAttribute("id");
  109. var isOpen = __root.find("#" + trid).get(0).getAttribute("open");
  110. isOpen = (isOpen == "Y") ? "N" : "Y";
  111. __root.find("#" + trid).get(0).setAttribute("open", isOpen);
  112. __root.find("#" + id).get(0).setAttribute("op", isOpen);
  113. //__root.find("#" + trid).attr("open", isOpen);
  114. showHiddenNode(trid, isOpen);
  115. });
  116. }
  117. //显示或隐藏子节点数据
  118. showHiddenNode = function (_trid, _open) {
  119. if (_open == "N") { //隐藏子节点
  120. __root.find("#" + _trid).find("img[folder='Y']").attr("src", folderCloseIcon);
  121. __root.find("tr[id^=" + _trid + "_]").css("display", "none");
  122. } else { //显示子节点
  123. __root.find("#" + _trid).find("img[folder='Y']").attr("src", folderOpenIcon);
  124. showSubs(_trid);
  125. }
  126. }
  127. //递归检查下一级节点是否需要显示
  128. showSubs = function (_trid) {
  129. var isOpen = __root.find("#" + _trid).get(0).getAttribute("open");
  130. if (isOpen != "N") {
  131. var trs = __root.find("tr[pid=" + _trid + "]");
  132. trs.css("display", "");
  133. for (var i = 0; i < trs.length; i++) {
  134. showSubs(trs[i].id);
  135. }
  136. }
  137. }
  138. //展开或收起所有节点
  139. this.expandAll = function (isOpen) {
  140. var trs = __root.find("tr[pid='']");
  141. for (var i = 0; i < trs.length; i++) {
  142. var trid = trs[i].id || trs[i].getAttribute("id");
  143. showHiddenNode(trid, isOpen);
  144. }
  145. }
  146. //取得当前选中的行记录
  147. this.getSelectedItem = function () {
  148. return new TreeGridItem(__root, __selectedId, __selectedIndex, TreeGrid.str2json(__selectedData));
  149. }
  150. };
  151. //公共静态变量
  152. TreeGrid.FOLDER_OPEN_ICON = "../Images/folderOpen.gif";
  153. TreeGrid.FOLDER_CLOSE_ICON = "../Images/folderClose.gif";
  154. TreeGrid.DEFAULT_LEAF_ICON = "../Images/defaultLeaf.gif";
  155. TreeGrid.COUNT = 1;
  156. //将json对象转换成字符串
  157. TreeGrid.json2str = function (obj) {
  158. var arr = [];
  159. var fmt = function (s) {
  160. if (typeof s == 'object' && s != null) {
  161. if (s.length) {
  162. var _substr = "";
  163. for (var x = 0; x < s.length; x++) {
  164. if (x > 0) _substr += ", ";
  165. _substr += TreeGrid.json2str(s[x]);
  166. }
  167. return "[" + _substr + "]";
  168. } else {
  169. return TreeGrid.json2str(s);
  170. }
  171. }
  172. return /^(string|number)$/.test(typeof s) ? "'" + s + "'" : s;
  173. }
  174. for (var i in obj) {
  175. if (typeof obj[i] != 'object') { //暂时不包括子数据
  176. arr.push(i + ":" + fmt(obj[i]));
  177. }
  178. }
  179. return '{' + arr.join(', ') + '}';
  180. }
  181. TreeGrid.str2json = function (s) {
  182. var json = null;
  183. if (jQuery.support.msie) {
  184. json = eval("(" + s + ")");
  185. } else {
  186. json = new Function("return " + s)();
  187. }
  188. return json;
  189. }
  190. //数据行对象
  191. function TreeGridItem(_root, _rowId, _rowIndex, _rowData) {
  192. var __root = _root;
  193. this.id = _rowId;
  194. this.index = _rowIndex;
  195. this.data = _rowData;
  196. this.getParent = function () {
  197. var pid = jQuery("#" + this.id).attr("pid");
  198. if (pid != "") {
  199. var rowIndex = jQuery("#" + pid).attr("rowIndex");
  200. var data = jQuery("#" + pid).attr("data");
  201. return new TreeGridItem(_root, pid, rowIndex, TreeGrid.str2json(data));
  202. }
  203. return null;
  204. }
  205. this.getChildren = function () {
  206. var arr = [];
  207. var trs = jQuery(__root).find("tr[pid='" + this.id + "']");
  208. for (var i = 0; i < trs.length; i++) {
  209. var tr = trs[i];
  210. arr.push(new TreeGridItem(__root, tr.id, tr.rowIndex, TreeGrid.str2json(tr.data)));
  211. }
  212. return arr;
  213. }
  214. };