JavaScript JQuery

有两种JQuery扩展方法

1. JQuery扩展工具类方法

$.extend({
    consoleLog : function (info) {
        console.log(info);
    },
    DateFormatter : function (date, formatter) {
        // 日期格式化
    }
});

使用方法:

// 控制台打印
$.consoleLog("helloWorld!");


2. JQuery扩展对象类方法

;(function($){
    /**
     * 扩展JQuery 方法
     */
    $.fn.extend({
        "treeGrid" : function (_config) {
            // 初始换 属性表格
            return this;
        }
    });
})(jQuery);
使用方法:
<table id="treeGrid"></table>

$("#treeGrid").treeGrid({...});


3. 自定义TreeGrid

自己随便写的, 基于boot strap 3.0.7, 还有许多需要完善,当作例子吧

/* =========================================================*
 * 自定义 TreeGrid with bootstrap 3.0.7
 * =========================================================
 * Copyright © miselehe.com. All rights reserved.
 * 基础字段
 * {id:"id_value",
 * text:"fieldName",
 * parentId: "parentId",
 * 
 * children:[{...},{...},...]}
 * ========================================================= */
;(function($){
	// 声明在严格模式下运行
	"use strict";
	
	// 属性菜单默认配置
	var default_config = {
		style: "table table-striped table-bordered", // 默认样式
		fieldId: "id", // 菜单项默认id
		baseRender: "text", // 对应菜单名称列显示数据 JSON key 引用名称
		fieldFormName: "id", // 默认多选框、单选框 表单域名称
		baseFieldName: "菜单名称", // 默认菜单列显示名称
//		checkbox: true, // 是否显示多选框, 默认显示多选框,优先级高于多选框
//		radio: true, // 是否显示单选框,默认显示, 优先级低于多选框
		lineNo: true, // 是否显示行号, 默认显示
		extColumns: [], // 扩展字段
		data:[] // 数据
	};
	
	/**
	 * 创建树形表格对象
	 */ 
	var TreeGrid = function (_this, config) {
		// 初始化方法
		this.init(_this, config);
		// 创建 TreeGrid
		this.build();
	};
	
	
	/**
	 * 初始化方法
	 */
	TreeGrid.prototype.init = function(_this, config) {
		// 初始化前, 重复初始化处理
		if (!this.initialized) {
			// 初始化
			this.initialized = true;
			this.targetObj = _this;
			this.config = config;
			this.lineNoVal = 0;
			this.nodes = [];
		} else {
			this.errorInfo = "init error";
		}
	};
	
	/**
	 * 构建 TreeGrid
	 */
	TreeGrid.prototype.build = function () {
		// 设置默认样式
		this.targetObj.addClass(this.getConfig("style"));
		
		// 扩展字段
		var extColumns = this.getConfig("extColumns");
		// 数据
		var gridData = this.getConfig("data");
		
		// 设置标题
		this.setGridHead(extColumns);
		// 设置内容
		this.setGridData(extColumns, gridData);
	}
	
	
	/**
	 * 设置TreeGrid head 信息
	 */
	TreeGrid.prototype.setGridHead = function (extColumns) {
		var _thead = $("<thead></thead>");
		var _tr = $("<tr></tr>");
		
		/**
		 * 基础字段
		 */ 
		// 是否显示行号
		var lineNo = this.getConfig("lineNo");
		if (lineNo) {
			_tr.append($("<th></th>").text("#").css({"width":"50px"}));
		}
		_tr.append($("<th></th>").text(this.getConfig("baseFieldName")));
		
		/**
		 * 扩展字段
		 */
		if (extColumns instanceof Array && extColumns.length > 0) {
			$.each(extColumns, function(key, obj){
				_tr.append($("<th></th>").text(obj.text));
			});
		}
		_thead.append(_tr);
		this.targetObj.append(_thead);
	}
	
	/**
	 * 设置TreeGrid data信息 
	 */
	TreeGrid.prototype.setGridData = function (extColumns, gridData) {
		var level = 0;
		var lineNoVal = 1;
		var _tbody = $("<tbody></tbody>");
		this.recursionNode(_tbody, extColumns, gridData, level);
		this.targetObj.append(_tbody);
	}
	
	/**
	 * 递归节点
	 */
	TreeGrid.prototype.recursionNode = function (_tbody, extColumns, gridData, level) {
		var _treeGrid_Obj = this;
		if (gridData instanceof Array && gridData.length > 0) {
			// 是否显示行号
			var lineNo = _treeGrid_Obj.getConfig("lineNo");
			// 基础字段名称
			var renderField = _treeGrid_Obj.getConfig("baseRender");
			
			for (var i = 0; i < gridData.length; i++) {
				var obj = gridData[i];
				
				_treeGrid_Obj.nodes[obj.id] = obj;
				
				var _tr = $("<tr></tr>").attr({"tg_id": obj.id, "tg_pid": obj.parentId});
				/**
				 * 基础字段
				 */
				if (lineNo) {
					// 显示行号
					_tr.append($("<td></td>").text(++_treeGrid_Obj.lineNoVal));
				}
				var base_td = $("<td></td>");
				base_td.append("<span class='mslh_block"+ level +"'></span>");
				
				if(obj.children != null && obj.children.length > 0) {
					base_td.append($("<span class='glyphicon glyphicon-minus'></span>").click(function(){
						_treeGrid_Obj.toggleNodeExpanded(_treeGrid_Obj, this);
					}));
				} else {
					base_td.append("<span class='glyphicon glyphicon-grain'></span>");
				}
				base_td.append(obj[renderField]);
				_tr.append(base_td);
				
				/**
				 * 扩展字段
				 */
				$.each(extColumns, function(key, _column_obj){
					// 是否存在格式化需求
					if (_column_obj.formatter != null && typeof _column_obj.formatter == 'function') {
						_tr.append($("<td></td>").append(_column_obj.formatter(obj)));
					} else {
						_tr.append($("<td></td>").text(obj[_column_obj.render]));
					}
				});
				_tbody.append(_tr);
				_treeGrid_Obj.recursionNode(_tbody, extColumns, obj.children, level+1);
			}
		}
	}
	
	/**
	 * 切换节点展开折叠状态
	 * param obj  span
	 */
	TreeGrid.prototype.toggleNodeExpanded = function (_treeGrid_Obj, obj) {
		var _obj = $(obj);
		if (_obj.hasClass("glyphicon-plus")) {
			_obj.removeClass("glyphicon-plus").addClass("glyphicon-minus");
			// 展开当前节点 下级节点
			var _curTr = _obj.parents("tr[tg_id]");
			_curTr.nextAll("[tg_pid='" + _curTr.attr("tg_id") + "']").show();
		} else {
			// 递归:折叠下级节点
			// 展开当前节点 下级节点
			var _curTr = _obj.parents("tr[tg_id]");
			_treeGrid_Obj.nodeExpandedRecursion(_treeGrid_Obj, _curTr);
		}
	}
	
	/**
	 * 递归:折叠下级节点
	 * param obj tr
	 */
	TreeGrid.prototype.nodeExpandedRecursion = function (_treeGrid_Obj, _curTr) {
		_curTr.find("span[class*='glyphicon-minus']").removeClass("glyphicon-minus").addClass("glyphicon-plus");
		// 递归:折叠下级节点
		_curTr.nextAll("[tg_pid='" + _curTr.attr("tg_id") + "']").hide().each(function(key, nextNode){
			_treeGrid_Obj.nodeExpandedRecursion(_treeGrid_Obj, $(nextNode));
		});
	}
	
	/**
	 * 获取TreeGrid配置参数
	 */
	TreeGrid.prototype.getConfig = function (key) {
		if (this.config[key] != null && this.config[key] != undefined) {
			return this.config[key];
		} else {
			return default_config[key];
		}
	}
	
	/**
	 * 通过Id 获取节点信息
	 */
	TreeGrid.prototype.getNode = function (nodeId) {
		return this.nodes[nodeId];
	}
	
	/**
	 * 扩展JQuery 方法
	 */
	$.fn.extend({
		"treeGrid" : function (_config) {
			var _treeGridObj = this.data("treeGridObj");
			if (_treeGridObj == null || $.isEmptyObject(_treeGridObj)) {
				var treeGrid = new TreeGrid(this, _config);
				this.data("treeGridObj", treeGrid);
				return treeGrid;
			}
			return _treeGridObj;
		}
	});
})(jQuery);
 

使用:

<script type="text/javascript">
    $(function(){
        $.get(url, "", function(data){
            $("#treeGrid").treeGrid({
                baseRender: "menuName",
                extColumns:[{
                    render:"menuType", text:"菜单类型",
                    formatter: function (obj) {
                        if (obj.menuType == "1") {
                            return '<span class="glyphicon glyphicon-certificate"></span>节点';
                        } else if (obj.menuType == "2") {
                            return '<span class="glyphicon glyphicon-leaf"></span>菜单';
                        } else if (obj.menuType == "3") {
                            return '<span class="glyphicon glyphicon-fire"></span>功能';
                        }
                    }
                },{
                    render:"hasSub", text:"子节点",
                    formatter: function(obj){
                        if (obj.hasSub=="1") {
                            return "存在";
                        } else {
                            return "不存在";
                        }
                    }
                },{
                    render:"menuUrl", text:"URL"
                },{
                    render:"theFlag", text:"页面标记"
                },{
                    render:"grade", text:"层级"
                },{
                    render:"createTime", text:"创建时间"
                },{
                    render:"sort", text:"顺序"
                },{
                    render:"enFlag", text:"状态", 
                    formatter : function(obj) {
                        var str = '<div class="switch switch-mini">';
                        str += '<input type="checkbox" class="enFlag" value="' + obj.enFlag + '" menuId="' + obj.id + '" ' + (obj.enFlag == "1" ? 'checked' : '') + '/>';
                        str += '</div>';
                        return str;
                    }
                },{
                    render:"enFlag", text:"操作", 
                    formatter : function(obj) {
                        var str = '';
                        if (obj.menuType != "3") {
                            str += '<span onclick="addSubMenu(' + "'" + obj.id + "'" + ')" class="glyphicon glyphicon-plus-sign" title="添加子节点"></span>';
                        }
                        str += '<span onclick="move(' + "'" + obj.id + "'" + ')" class="glyphicon glyphicon-move" title="移动"></span>';
                        str += '<span onclick="edit(' + "'" + obj.parentId + "','" + obj.id + "'" + ')" class="glyphicon glyphicon-pencil" ></span>';
                        str += '<span onclick="remove(' + "'" + obj.menuName + "','" + obj.id + "'" + ')" class="glyphicon glyphicon-trash"></span>';
                        return str;
                    }
                }],
                data: data
            });
            
            // 初始化状态开关
            switchInit();
        });
    });
</script>





转载请指明出处!http://www.miselehe.com/article/view/14