`

表格列过滤功能 [系列1]

    博客分类:
  • js
阅读更多
注:用到prototype.js中的$("xxx")方法。


/**
 * columnFilter.js
 * 表格列过滤功能
 * tabObj 表格对象
 * 特点:
 * 1. 不支持单元格合并后的表格
 * 2. 不支持多列同时过滤,单次只弹出一个下拉狂
 * 3. 鼠标悬停在表格的标题行的某单元格上,指针呈现手型,单击即弹出下拉框,选择某个选项即可看到过滤效果
 *
 * Sample:
 * <script>
 *		//过滤
 *		var columnFilter = new ColumnFilter(document.getElementById("table1"));
 *		//参数"[1,2,3,4,5,6]": 	给第2至7列增加过滤功能(列序号是从0开始计),
 *      //参数"1":  				如果是动态生成不定数量的列,列数可能小于6,则给定一个参考列序号,添加过滤的列的最大序号,不会超过参考列序号,这里传"1"是表示:倒数第0、1列不加过滤功能。  
 *		columnFilter.doAddHandler([1,2,3,4,5,6],1);
 * </script>
 */
function ColumnFilter(tabObj){
	
	var _tabObj = tabObj;
	var rowNumber = _tabObj.rows.length;
	var colNumber = _tabObj.rows[0].cells.length;
	var filterCols; //参数,列序数组
	var maxCol; //如果列数是动态变化的,则用maxCol来表示需要过滤的最大列序
	var curCol;	//当前列序
	var select = ""; //下拉选项
	var originText; 
		
	//方法集合
	var methods = {
		/** 检查参数是否越界 */
		doCheckCol:function(col){
			if(col>colNumber-1){
				return false; 
			}
			return true;
		}, 
		/** 恢复列表的状态 */
		doResume:function(isChangeFilter){
			for(var i=1; i<rowNumber;i++){ 
				$("trr" + (i-1)).style.display="block";
			}
			
			//变更过滤条件
			if(isChangeFilter){
				if(this.curCol!=null && this.curCol!=undefined){
					_tabObj.rows[0].cells[this.curCol].innerHTML = "<div onclick='columnFilter.doRender(" + this.curCol + ");' style='width:100%;height:100%;' title='单击过滤'>" + this.originText + "</div>";
				}
			}
		},
		/** 过滤 */
		doFilter:function(obj,col){	
			var val = obj.options[obj.selectedIndex].value;
			if(val==this.originText){ 
				this.doResume(true);
				return;
			}
			 
			this.doResume();
			for(var i=rowNumber-1; i>0;i--){ 
				//alert("val=" + val + "; _tabObj.rows["+i+"].cells["+col+"].innerText="+_tabObj.rows[i].cells[col].innerText);
				if(_tabObj.rows[i].cells[col].innerText!=val){
					 $("trr" + (i-1)).style.display="none";
				}
			}
		},
		/** 去掉重复的过滤条件 */
		doRemoveDup:function(){
			var options = new Array(); 
			for(var i=1; i<rowNumber;i++){
				var dup = false;
				for(var j=0;j<options.length;j++){
					if(_tabObj.rows[i].cells[this.curCol].innerText==options[j]){
						dup = true;
						break;
					}
				}
				if(dup){continue;}
				options[options.length] = _tabObj.rows[i].cells[this.curCol].innerText; 
			}
			return options;
		},
		/** 生成过滤器 */
		doRender:function(col){ 
			//目前不支持多列过滤, 会将上次过滤的列恢复原状态 
			this.doResume(true);
			
			this.curCol = col;
			this.originText = _tabObj.rows[0].cells[this.curCol].innerHTML;
			select = "<select id='ddl_" + this.curCol + "' onchange='columnFilter.doFilter(this," + this.curCol + ");' style='width:100%;height:100%'>" + 
					 "<option value='" + this.originText + "'>" + this.originText + "</option>";
					 
			var options = this.doRemoveDup();
			for(var i=0;i<options.length;i++){
				select += "<option value='" + options[i] + "'>" +options[i] + "</option>";
			}
			select += "</select>";  
			_tabObj.rows[0].cells[this.curCol].innerHTML = "<div style='width:100%;height:100%;' >" +select + "</div>";
		},
		/** 绑定过滤事件 */
		/**
		 * cols 列序数组
		 * lastIndexOfMaxCol 首个无过滤条件的列的逆序
		 */
		doAddHandler:function(cols, lastIndexofMaxCol){ 
			//列表内容行不能为空
			if($("trr0")==undefined){return;}
		 
			this.filterCols = cols;
			if(this.filterCols==undefined || this.filterCols.length==0){return;} 
			if(lastIndexofMaxCol!=undefined){
				this.maxCol = colNumber - lastIndexofMaxCol - 2;
			}
			 
			for(var i=0; i<this.filterCols.length;i++){
				var col = this.filterCols[i];
				if(!this.doCheckCol(col)){return;}
				if(this.maxCol!=undefined){
					if(col>this.maxCol){return;}
				}
				
				//给col列Header增加单击事件
				var headerText = _tabObj.rows[0].cells[col].innerHTML;
				_tabObj.rows[0].cells[col].innerHTML = "<div onclick='columnFilter.doRender(" + col + ");' style='width:100%;height:100%;cursor:hand;' title='单击过滤'>" + headerText + "</div>";
			}
		}
	};
	
	return methods; 
}




后续会介绍[系列2], 其将实现:
1. 支持单元格合并后的表格
2. 支持多列同时过滤
2
0
分享到:
评论

相关推荐

    表格列过滤功能 [系列2]

    "表格列过滤功能 [系列2]" 这个主题主要关注如何实现或优化这一功能。博文链接提供了更深入的技术讨论,但在这里,我们将详细讲解一些核心概念和实现方法。 首先,我们要理解“列过滤”是什么。在电子表格或数据库...

    很好很强大的datagridview(强大的过滤功能和其他设置)包含源码

    本资源"很好很强大的datagridview(强大的过滤功能和其他设置)"显然集中展示了该控件的一些高级用法,特别是其过滤功能和其他自定义设置,这对于数据量大或者需要用户进行复杂操作的应用场景非常有用。 首先,让我们...

    smarttable带排序和过滤功能的jQuery表格插件

    2. **过滤功能**:SmartTable提供了字段过滤功能,允许用户输入关键词筛选符合特定条件的行。这增强了用户体验,让用户能够快速定位到感兴趣的数据。 3. **分页显示**:当表格数据量过大时,SmartTable可实现分页...

    easyui-datagrid可编辑可过滤的DEMO

    EasyUI DataGrid的过滤功能通过在列头添加过滤图标实现,用户可以输入文本、选择范围或者使用下拉框等进行过滤。过滤条件可以是单一的,也可以组合使用,提供了非常灵活的筛选机制。 在实际应用中,这些功能对于...

    vuetablecomponent用于展示表格的Vue组件支持过滤和排序

    2. **过滤功能**:`vue-table-component`允许用户通过输入框对表格数据进行实时过滤。这通常通过在组件上定义过滤条件并监听用户的输入事件实现,使用户能快速找到特定的信息。 3. **排序功能**:对于有多个列的...

    EXcel 过滤器.rar

    Excel过滤器是Excel电子表格软件中的一个重要功能,它允许用户快速筛选和查看数据表中的特定信息,从而提高数据处理和分析的效率。本压缩包文件“EXcel 过滤器.rar”很可能包含了一系列关于如何使用Excel过滤器的...

    表格变色功能

    在标签“表格”中,我们可以联想到一系列与表格处理相关的知识点: 1. 数据输入:表格提供了一种结构化的数据输入方式,可以方便地组织和管理大量信息。 2. 公式和函数:表格软件通常支持各种计算公式和统计函数,...

    BCGDBGrid多功能数据表格控件

    - 这个文件很可能是BCGDBGrid的演示程序,它包含了一系列示例,展示了控件的各种功能和用法,对于学习和理解BCGDBGrid的使用非常有帮助。 总的来说,BCGDBGrid是一款高效且功能全面的数据表格控件,适合于开发要求...

    Axure夜话之中继器系列视频教程之中继器表格分页动态页数.rar

    《Axure夜话之中继器系列视频教程之中继器表格分页动态页数》是针对交互设计师和产品经理的一款深入学习资源,由资深讲师程矢在老二牛车教育平台上讲解。该教程主要聚焦于Axure中继器(Repeater)功能的使用,特别是...

    Bootstrap表格编辑生成器插件.rar

    1. **动态列生成**:允许根据用户需求或服务器端提供的数据动态添加或移除表格列。这在处理不同用户角色或不同场景的数据展示时非常有用,可以根据权限或特定需求定制列显示。 2. **编辑功能**:表格中的数据可编辑...

    js网页 表格 控件

    1. **Bootstrap Table**:基于流行的Bootstrap框架,提供了一系列的样式和功能,如排序、搜索、分页等,只需引入CSS和JS文件,通过特定的类名就能轻松实现。 2. **Handsontable**:这是一个强大的数据网格组件,...

    vuedatatablesVueJS2数据表格

    5. **过滤(filter)**:在`vuedatatables`中,过滤功能允许用户根据特定条件筛选表格数据,这通常通过在表格列上设置输入框或者下拉菜单实现,用户输入关键词后,表格会实时更新显示匹配的行。 6. **排序(sort)*...

    bootstrap动态表格模板

    数据筛选功能允许用户根据特定条件过滤表格中的行,以显示符合要求的信息。在Bootstrap的动态表格模板中,这通常通过输入框实现,用户可以在输入框中输入关键词,系统会实时更新表格,只显示包含该关键词的行。这种...

    TMS Pack打造多功能表格 v1.0源文件..rar

    通过这个组件包,开发者可以利用TMS Pack的强大功能,创建出拥有列排序、过滤、分组、数据绑定、自定义渲染等高级特性的表格。此外,由于提供了源代码,开发者还可以根据实际需求对组件进行二次开发,以实现更复杂的...

    CSS3响应式多功能表格样式特效.rar

    此外,CSS3还支持数据表的分组、排序和过滤功能。通过使用`display: table`、`display: table-row`和`display: table-cell`等CSS属性,我们可以将HTML元素布局为表格结构。同时,可以利用JavaScript库如jQuery或...

    易语言自绘表格样式

    为了绘制表格,我们需要创建一系列子程序,如初始化表格、绘制单元格、计算单元格尺寸等。 3. **创建与销毁**:在程序运行过程中,创建表格对象并分配资源,然后在不再需要时释放这些资源,这是内存管理的基础。在...

    WEB表格控件 DateTables

    它提供了一系列强大的功能,如排序、过滤、分页以及对大量数据的处理,使网页上的表格更加交互式和用户友好。 **描述分析:**"开源的WEB表格控件 DataTables" 开源意味着DataTables的源代码是公开的,允许开发者...

    JIDE Grids (表格)开发员技术手册

    - **过滤功能**:`FilterableTableModel`支持按列过滤,通过`FilterFactoryManager`和`CustomFilterEditor`等工具实现。 - **颜色和日期相关组件**:提供了多种颜色和日期选择组件,包括`ColorChooserPanel`、`...

    高级表格支持库

    高级表格支持库通常包括一系列功能,如自定义排序、过滤、分组、公式计算、图表生成等,以满足企业和开发者的高级需求。 高级表格支持库的关键知识点可以分为以下几个部分: 1. **数据模型**:这些库通常提供强大...

Global site tag (gtag.js) - Google Analytics