今天呢,笔者,利用js(真的感觉,前端的一切技术都是js,或者js都能够实现)做了一个自定义table显示列的小插件。 一、假设我们有这样一个表格

<table id="201808251915">
				<tr>
					<th>序号</th>
					<th>测试2</th>
					<th>测试3</th>
					<th>测试4</th>
					<th>测试5</th>
					<th>测试6</th>
					<th>测试7</th>
					<th>测试8</th>
					<th>测试9</th>
					<th>测试911</th>
					<th>测试12</th>
					<th>测试13</th>
					<th>测试14</th>
				</tr>
				<tbody>
					<tr>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
						<td>雨水的气味</td>
					</tr>
				</tbody>
			</table>

二、设计思路 ①、点击自定义列时,读取当前table th的内容与对应的序号 ②、数组中排除,始终显示的列 ③、跳转action至复选框选择列界面(参数为:tableId、数组{[序号,列名],[序号1,列名1],.....}和<input type="hidden" name="show_table_col" id="show_table_col" value='<ss:property value="show_table_col"/>'>的值--供初始化复选框勾选事件 ) ④、用户在Dialog中,点选复选框时,改写<input type="hidden" name="show_table_col" id="show_table_col" value='<ss:property value="show_table_col"/>'>的值,即时生效控制table的列显示与隐藏。 ⑤、页面刷新标签以及上一页下一页之类的,默认通过$(document).ready{function() {});来控制当前table列的显示与隐藏。

三、插件配置 1、在需要控制table的显示列的位置,定义table的Id 2、当前页面若存在刷新,则需要封装show_table_col参数

<input type="hidden" name="show_table_col" id="show_table_col" value='<ss:property value="show_table_col"/>'>

和页面初始化,加载的函数

$(document).ready(function() {
		//初始化,table自定义显示
		document_function_table_show_column("<ss:property value='show_table_col'/>", '201808251915');
	});
/*初始化加载,自定义显示列 Red_Ant_Hoyl 20180825*/
	function document_function_table_show_column(show_column_num, tableId){
		if(show_column_num != ''){//判断页面初始化,或者是用户自定义的全不显示
			//用户自定义
			if(show_column_num == "empty"){//用户自定义,全不显示
				show_column_num = '';
			}
			data_single = show_column_num.split(',');
			var	column_item = $("#"+tableId + " th",);
		 	for (var i = 0; i < column_item.size(); i++) {
				var index = $.inArray(""+i, data_single);
				if(index > -1){//含有该列,则显示
					$("#" + tableId).find('th').eq(i).show();//处理表头
					var tbody = $("#" + tableId).find('tbody');
					var tbodyLst = tbody.find('tr');
					for (var j = 0; j < tbodyLst.size(); j++) {
						tbodyLst.eq(j).find('td').eq(i).show();
					}
				}else{
					$("#" + tableId).find('th').eq(i).hide();//处理表头
					var tbody = $("#" + tableId).find('tbody');
					var tbodyLst = tbody.find('tr');
					for (var j = 0; j < tbodyLst.size(); j++) {
						tbodyLst.eq(j).find('td').eq(i).hide();
					}	
				} 
			} 
		}
	}
	

4、定义自定义列函数

`   <a class="btn" onclick="show_table_column('1', '201808251915', this, '显示的名称')">自定义列</a>`
function show_table_column(condition, table_id, obj, title){
		/* 考虑:1、是否留有,默认显示(是否所有列,皆可控显示) */
		var column_content = [];//table内容
		/*全部读取,th内容*/
		var	column_item = $("#"+table_id + " th");
		for (var i = 0; i < column_item.size(); i++) {
			column_content.push([i, $("#"+table_id).find('th').eq(i).html()]);//追加数组
		}
		/*跳转action,弹出自定义列,对话框*/
		var old_column_content = $("#show_table_col").val();//当前用户已经选择的内容
		var whole_column = JSON.stringify(column_content);
		var tSessionId = new Date().getTime();
		var url = "selfDefinedColumn.action?t"+tSessionId + "&table_id=" + table_id + "&condition=" + condition +"&old_column_content="+old_column_content+"&whole_column="+whole_column;
		$(obj).attr("href", url);
		$(obj).attr("title","自定义" + title + "显示列");
		$(obj).attr("target","Dialog");
	}
	

5、后端处理

	private String table_id;//当前Table Id
	private String whole_column;//待选择的,table 列
	private String old_column_content;//已选择的数据
	private List<Object> selfColumnLst = new ArrayList<Object>();
	private String condition;//用户的默认选择数据
Boolean flag = null;//是否已选择,false是未选择 ,true是已选择
		List<String> oldLst = null;
		List<String> conditionLst = null;
		//判断当前的默认选择
		if(StringHelper.isNotEmpty(condition)){
			conditionLst = Arrays.asList(condition.split(","));
			/*那么,用户无论选啥,都不会出现,用户自定义全不显示的情况*/
		}
		if(StringHelper.isEmpty(old_column_content)){//初始化显示
			flag =  true;
		}else if(old_column_content.equals("empty")){//用户自定义全不显示
			flag = false;
		}else{//用户的自定义情况
			oldLst = Arrays.asList(old_column_content.split(","));
		}
		//解析Json数组,加载全部自定义列
		try {
			String now_column = new String(whole_column.getBytes("ISO-8859-1"), "utf-8");
			JSONArray wholeArray = new JSONArray(now_column);
			for (int i = 0; i < wholeArray.length(); i++) {
				JSONArray jsarray1 = new JSONArray(wholeArray.get(i).toString());
				Object[] obj = new Object[4];
				obj[0] = jsarray1.get(0).toString();//table 列所在位置
				obj[1] = jsarray1.get(1).toString();//table 列内容
				if(conditionLst != null && conditionLst.size() > 0){
					if(conditionLst.contains(obj[0])){
						obj[3] = false;//当前列不做选择显示
					}
				}
				if(flag != null){
					obj[2] = flag;
				}else{
					if(oldLst != null && oldLst.size() > 0){
						if(oldLst.contains(obj[0])){
							obj[2] = true;
						}else{
							obj[2] = false;
						}
					}
				}
				selfColumnLst.add(obj);
			}
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

6、Dialog中

		<div align="center" style="width: 230px;">
			<form class="form-horizontal form-validate" id="self_show_table_column_form" method="post" name="self_show_table_column_form" style="width: 200px !important;">
				<table class="table table-bordered" style="width: 200px;">
					<tbody>
						<tr>
							<td style="padding-bottom: 1px !important; padding-top: 0px !important;">
								<input group="ids" id="checkbox_all" onclick="checkAll(this);" class="cleck-all" type="checkbox"/>
							</td>
							<td style="border:0px;padding-bottom: 1px !important; padding-top: 0px !important;">
								全选
							</td>
						</tr>
						<ss:iterator value="selfColumnLst" status="rowstatus">
							<ss:set name="record" value="selfColumnLst[#rowstatus.index]"/> 
							<tr <ss:if test="#record[3] == false">style="display: none;" class="biechongle"</ss:if>>
								<td style="padding-bottom: 1px !important; padding-top: 0px !important;">
									<input type="checkbox" name="show_table_column_items" value="<ss:property value='#record[0]'/>" <ss:if test="#record[2] == true">checked="true"</ss:if>/>
								</td>
								<td class="text-center" style="padding-bottom: 1px !important; padding-top: 0px !important;">
									<ss:property value="#record[1]" />
								</td>
							</tr>
						</ss:iterator>
					</tbody>
				</table>
				<div class="set-btn" data-spy="affix" data-offset-top="200" align="center" style="margin-right: 25px;">
					<a css="btn green" caption="确定" onclick="make_table_column();" />
					<a type="button" css="btn" caption="取消" onclick="closeDialog();" />
				</div>
			</form>
		</div>
		<script>
			function make_table_column(){
				var ids=[];
				var tableId = "<ss:property value='table_id'/>";
				var obj = $("input[name='show_table_column_items']");
				for(var i=0; i<obj.length;i++){
					if(obj[i].checked){
						ids.push(obj[i].value);
						$("#" + tableId).find('th').eq(i).show();//处理表头
						$("#" + tableId).find('th').eq(i).removeAttr("name");
						$("#" + tableId).find('th').eq(i).attr("name","show");//给显示的th夹那么属性
						/*处理td*/
						debugger;
						var tbody = $("#" + tableId).find('tbody');
						var tbodyLst = tbody.find('tr');
						for (var j = 0; j < tbodyLst.size(); j++) {
							tbodyLst.eq(j).find('td').eq(i).show();
						}
					}else{
						$("#" + tableId).find('th').eq(i).removeAttr("name");
						$("#" + tableId).find('th').eq(i).hide();//处理表头
						/*处理td*/
						var tbody = $("#" + tableId).find('tbody');
						var tbodyLst = tbody.find('tr');
						for (var j = 0; j < tbodyLst.size(); j++) {
							tbodyLst.eq(j).find('td').eq(i).hide();
						}	
					}
				}
				if(ids.length > 0){//判断用户全选择不显示,还是页面的初始化
					$("#show_table_col").val(ids);
				}else{
					$("#show_table_col".val("empty");
				} 
				closeDialog();
			}

			function checkAll(obj){
				if(obj.checked){
					$("input:checkbox").attr("checked",true);
				}else{
					$("input:checkbox").attr("checked",false);
					$("#self_show_table_column_form").find("tbody tr:hidden").find("input:checkbox").attr("checked",true);
				}

			}
		</script>