TreeGrid = function (_config) { _config = _config || {}; var s = ""; var rownum = 0; var __root; var __selectedData = null; var __selectedId = null; var __selectedIndex = null; var folderOpenIcon = (_config.folderOpenIcon || TreeGrid.FOLDER_OPEN_ICON); var folderCloseIcon = (_config.folderCloseIcon || TreeGrid.FOLDER_CLOSE_ICON); var defaultLeafIcon = (_config.defaultLeafIcon || TreeGrid.DEFAULT_LEAF_ICON); //显示表头行 drowHeader = function () { s += ""; var cols = _config.columns; for (i = 0; i < cols.length; i++) { var col = cols[i]; s += "
" + (col.headerText || "") + "
"; } s += ""; } //递归显示数据行 drowData = function () { var rows = _config.data; var cols = _config.columns; drowRowData(rows, cols, 1, ""); } //局部变量i、j必须要用 var 来声明,否则,后续的数据无法正常显示 drowRowData = function (_rows, _cols, _level, _pid) { var op = "Y" var folderColumnIndex = (_config.folderColumnIndex || 0); for (var i = 0; i < _rows.length; i++) { var id = _pid + "_" + i; //行id var row = _rows[i]; s += ""; for (var j = 0; j < _cols.length; j++) { var col = _cols[j]; s += " "; } else { s += ">"; } //节点图标 if (j == folderColumnIndex) { if (row.children != "") { //有下级数据 s += ""; } else { s += ""; } } //单元格内容 if (col.handler) { s += (eval(col.handler + ".call(new Object(), row, col)") || "") + ""; } else { s += (row[col.dataField] || "") + ""; } } s += ""; //递归显示下级数据 if (row.children) { drowRowData(row.children, _cols, _level + 1, id); } } } //主函数 this.show = function () { this.id = _config.id || ("TreeGrid" + TreeGrid.COUNT++); s += ""; drowHeader(); drowData(); s += "
"; __root = jQuery("#" + _config.renderTo); __root.append(s); //初始化动作 init(); } init = function () { //以新背景色标识鼠标所指行 if ((_config.hoverRowBackground || "false") == "true") { __root.find("tr").hover( function () { if (jQuery(this).attr("class") && jQuery(this).attr("class") == "header") return; jQuery(this).addClass("row_hover"); }, function () { jQuery(this).removeClass("row_hover"); } ); } //将单击事件绑定到tr标签 __root.find("tr").bind("click", function () { __root.find("tr").removeClass("row_active"); jQuery(this).addClass("row_active"); //获取当前行的数据 __selectedData = this.data || this.getAttribute("data"); __selectedId = this.id || this.getAttribute("id"); __selectedIndex = this.rownum || this.getAttribute("rowIndex"); //行记录单击后触发的事件 if (_config.itemClick) { eval(_config.itemClick + "(__selectedId, __selectedIndex, TreeGrid.str2json(__selectedData))"); } }); //展开、关闭下级节点 __root.find("img[folder='Y']").bind("click", function () { var trid = this.trid || this.getAttribute("trid"); var id = this.id || this.getAttribute("id"); var isOpen = __root.find("#" + trid).get(0).getAttribute("open"); isOpen = (isOpen == "Y") ? "N" : "Y"; __root.find("#" + trid).get(0).setAttribute("open", isOpen); __root.find("#" + id).get(0).setAttribute("op", isOpen); //__root.find("#" + trid).attr("open", isOpen); showHiddenNode(trid, isOpen); }); } //显示或隐藏子节点数据 showHiddenNode = function (_trid, _open) { if (_open == "N") { //隐藏子节点 __root.find("#" + _trid).find("img[folder='Y']").attr("src", folderCloseIcon); __root.find("tr[id^=" + _trid + "_]").css("display", "none"); } else { //显示子节点 __root.find("#" + _trid).find("img[folder='Y']").attr("src", folderOpenIcon); showSubs(_trid); } } //递归检查下一级节点是否需要显示 showSubs = function (_trid) { var isOpen = __root.find("#" + _trid).get(0).getAttribute("open"); if (isOpen != "N") { var trs = __root.find("tr[pid=" + _trid + "]"); trs.css("display", ""); for (var i = 0; i < trs.length; i++) { showSubs(trs[i].id); } } } //展开或收起所有节点 this.expandAll = function (isOpen) { var trs = __root.find("tr[pid='']"); for (var i = 0; i < trs.length; i++) { var trid = trs[i].id || trs[i].getAttribute("id"); showHiddenNode(trid, isOpen); } } //取得当前选中的行记录 this.getSelectedItem = function () { return new TreeGridItem(__root, __selectedId, __selectedIndex, TreeGrid.str2json(__selectedData)); } }; //公共静态变量 TreeGrid.FOLDER_OPEN_ICON = "../Images/folderOpen.gif"; TreeGrid.FOLDER_CLOSE_ICON = "../Images/folderClose.gif"; TreeGrid.DEFAULT_LEAF_ICON = "../Images/defaultLeaf.gif"; TreeGrid.COUNT = 1; //将json对象转换成字符串 TreeGrid.json2str = function (obj) { var arr = []; var fmt = function (s) { if (typeof s == 'object' && s != null) { if (s.length) { var _substr = ""; for (var x = 0; x < s.length; x++) { if (x > 0) _substr += ", "; _substr += TreeGrid.json2str(s[x]); } return "[" + _substr + "]"; } else { return TreeGrid.json2str(s); } } return /^(string|number)$/.test(typeof s) ? "'" + s + "'" : s; } for (var i in obj) { if (typeof obj[i] != 'object') { //暂时不包括子数据 arr.push(i + ":" + fmt(obj[i])); } } return '{' + arr.join(', ') + '}'; } TreeGrid.str2json = function (s) { var json = null; if (jQuery.support.msie) { json = eval("(" + s + ")"); } else { json = new Function("return " + s)(); } return json; } //数据行对象 function TreeGridItem(_root, _rowId, _rowIndex, _rowData) { var __root = _root; this.id = _rowId; this.index = _rowIndex; this.data = _rowData; this.getParent = function () { var pid = jQuery("#" + this.id).attr("pid"); if (pid != "") { var rowIndex = jQuery("#" + pid).attr("rowIndex"); var data = jQuery("#" + pid).attr("data"); return new TreeGridItem(_root, pid, rowIndex, TreeGrid.str2json(data)); } return null; } this.getChildren = function () { var arr = []; var trs = jQuery(__root).find("tr[pid='" + this.id + "']"); for (var i = 0; i < trs.length; i++) { var tr = trs[i]; arr.push(new TreeGridItem(__root, tr.id, tr.rowIndex, TreeGrid.str2json(tr.data))); } return arr; } };