`
abruzzi
  • 浏览: 452415 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

过滤器(Filter)的实现(jQuery)

阅读更多

公司产品的一个新功能中涉及到一个过滤器:通过关键字快速的对结果集进行过滤,获得比较少的结果,方便用户选择。在网上找了找,有很多jQuery的插件,要么就是auto complete, 要么就是没有高亮的quick search,都不是很适合我们的场景,于是就自己实现了一个。用起来倒是还过得去,呵呵。

 

效果图:

对一个List进行过滤(假设List很长,隐藏掉其他无关的项,例子里是美国的50个州,只搜索有"na"字符串的):



 对一个table进行过滤(table的其他列不隐藏,只是高亮搜索到的):



 当然,可以将其结合在一起,那样一个页面中可以有多个过滤器:



其实,实现起来,代码量很小,这里先大概说一下原理:

将搜索框中的字符收集起来,作为关键字,当搜索框中的内容发生变化时(keyup事件 ),做一次过滤,将匹配的内容高亮起来(如果有上一次的内容,需要做一个清空处理,比如第一次键入的是a,第二次键入的是al,则在al键入之后要将之前高亮的a恢复正常)。

 

主要用到了javascript的正则表达式,还有就是jQuery的强大的选择器,下边看看具体代码(demo附后下载):

/**
 * this is the do-filter function, used to filter the contents
 *
 * @params contents contents is the container of all items which
 *         need to filter, it's a jQuery object.
 *
 * @params keyword keyword is a string, used to be the condition
 *         of the filter
 *
 * @params options options is a JSON object, may contains:
 *         {
 *          keep : true or false to detemine whether keep the container or not,
 *          reopts : regular expression options, may be "g", "i", or "gi" 
 *         }
 *
 */
function doFilter(contents, keyword, options){
	var filterOptions = jQuery.extend({
		keep : false, 
		reopts : "gi",
		highlight : "#caff70"
	}, options);
	
	if(!filterOptions.keep){contents.hide();}
	contents.each(function(){
		var text = $(this).text();
		var pattern = new RegExp(keyword, filterOptions.reopts);
		if(pattern.test(text)){
			var item = text.replace(pattern, function(t){
				return "<span style=\"background:"+filterOptions.highlight+"\">"+t+"</span>";
			});			
			$(this).html(item).show();
		}else{//clear search result of last
			$(this).find("span").each(function(){
				$(this).replaceWith($(this).text());
			})
		}
	});
}

 

主要的选项可以定制,如过滤的规则(正则表达式的选项,全局? 忽略大小写?),高亮色彩的配置,以及是否保留源数据集的可视性。比如,List这种控件,一般是较长的时候进行一下搜索过滤,不需要保持源数据集,而table这种控件,则一般需要保持控件的结构,需要保持源数据集。

 

用法如下:

	var sb = $("#searchBox").val("").focus();
	
	var resultSet = $("div#contentPanel div.item");//used for restore
	sb.keyup(function(){
		var str = $(this).val();
		doFilter(resultSet, str);
	});

首先,将用作填写关键字的input获取到,然后取得数据集的list,包装成jQuery对象,将doFilter绑定到input的keyup事件上即可。

 

好了,大概也说明白了,自己也加深一下记忆,这一向在实现一套基于web的控件,基本的模型已经差不多了,过两天整理整理分享一下,呵呵。

 

 

按照bluemeteor的建议,将highlight参数改成更为通用的css class,用户同时可以将字体信息等传入作为highlight。总体效果如前文中的截图。代码更新如下:

function doFilter(contents, keyword, options){
	var filterOptions = jQuery.extend({
		keep : false, 
		reopts : "gi",
		highlight : "highlight"
	}, options);
	
	if(!filterOptions.keep){contents.hide();}
	contents.each(function(){
		var text = $(this).text();
		var pattern = new RegExp(keyword, filterOptions.reopts);
		if(pattern.test(text)){
			var item = text.replace(pattern, function(t){
				return "<span class=\""+filterOptions.highlight+"\">"+t+"</span>";
			});			
			$(this).html(item).show();
		}else{//clear search result of last
			$(this).find("span."+filterOptions.highlight).each(function(){
				$(this).replaceWith($(this).text());
			})
		}
	});
}
 
  • 大小: 9.3 KB
  • 大小: 5.6 KB
  • 大小: 3.5 KB
分享到:
评论
20 楼 abruzzi 2010-04-26  
zhangjf108 写道
看起来相当强大!

呵呵,看到你的回复我才想起来还有这么一篇文章呢,现在这个Filter使用了Base,做成了面向对象的了(主要是一个产品里用到了这个过滤器,而且多处引用,做成OO的方便一些),等“JavaScript内核系列”出完了再整理下,作为续篇。
19 楼 zhangjf108 2010-04-26  
看起来相当强大!
18 楼 abruzzi 2009-11-27  
childrentown 写道
lzyzizi 写道
抱歉,按收藏的时候按错了下隐藏贴,~~心有愧 贴别来支持下楼主

呵呵,不用客气。主要目的是分享下实际项目中用到的技术,能做到对别有有用我就很高兴了。


to lzyzizi:
不好意思,chrome上的帐号(childrentown)是上次同事登录后留下的,我一般用ff,不小心用他的账号回复了,
17 楼 childrentown 2009-11-27  
lzyzizi 写道
抱歉,按收藏的时候按错了下隐藏贴,~~心有愧 贴别来支持下楼主

呵呵,不用客气。主要目的是分享下实际项目中用到的技术,能做到对别有有用我就很高兴了。
16 楼 horseroad 2009-11-27  
abruzzi 写道
horseroad 写道
个人水平有限,js、jquery仅限于会用,不过东东很好,收藏了!但是代码没看太懂。不知道怎么才能搞懂呢?

这个实现其实不复杂,可以分成这样几步:

1.保存原始列表,以备恢复。
2.将原始列表中的所有Item遍历,用正则表达式进行匹配,匹配的高亮
3.注册这个过程到searchbox的keyup时间上

仅此而已,实现上用的是jQuery,所以代码量很小。

呵呵,非常感谢耐心解析,后来我又仔细看了一遍代码,也看懂了没个语句具体干些什么,现在看你这么一个解析更加清楚了~再次感谢
15 楼 lzyzizi 2009-11-27  
抱歉,按收藏的时候按错了下隐藏贴,~~心有愧 贴别来支持下楼主
14 楼 abruzzi 2009-11-25  
a3mao 写道
呵呵 这样的插件有很多,我就用过一个:autocomplete.js 这个也很好用的

不一样撒,
autocomplete是对一个外部的内容区(内容一般在服务端)进行过滤,并最终"完成"一个InputFileld。
Filter则是对一个内容区(一般在页面上)进行过滤,最终用户要的是过滤后的内容区!

也可以看成这样,autocomplete是给inputfield附加上一个内容区,而filter则是给一个内容区附加一个inputfield。两者正好相反,呵呵。
13 楼 a3mao 2009-11-24  
呵呵 这样的插件有很多,我就用过一个:autocomplete.js 这个也很好用的
12 楼 admyefei 2009-11-23  
大家在google搜“在线输入法”,有一个用javascript实现的输入法,速度很快,本人技术浅薄,不知道如何实现的。觉着和这个帖子的filter有点相似,而且本人正想做一个1000多条记录的字典,不知道怎么才能用javascript实现。
11 楼 admyefei 2009-11-23  
childrentown 写道
admyefei 写道
我怎么感觉很卡,性能有问题

我用这个JFilter在FF和IE下都测了下(100条数据),没有感觉卡啊,你用的是什么浏览器?不过如果输入速度很快的话,好像是有些卡哦。

可能是我输入的快了些,不过相比我在输入法中输入的速度应该差不多,但是输入法就反应迅速多了。
没个人的体验还是不一样。
10 楼 abruzzi 2009-11-23  
horseroad 写道
个人水平有限,js、jquery仅限于会用,不过东东很好,收藏了!但是代码没看太懂。不知道怎么才能搞懂呢?

这个实现其实不复杂,可以分成这样几步:

1.保存原始列表,以备恢复。
2.将原始列表中的所有Item遍历,用正则表达式进行匹配,匹配的高亮
3.注册这个过程到searchbox的keyup时间上

仅此而已,实现上用的是jQuery,所以代码量很小。
9 楼 horseroad 2009-11-23  
个人水平有限,js、jquery仅限于会用,不过东东很好,收藏了!但是代码没看太懂。不知道怎么才能搞懂呢?
8 楼 childrentown 2009-11-23  
admyefei 写道
我怎么感觉很卡,性能有问题

我用这个JFilter在FF和IE下都测了下(100条数据),没有感觉卡啊,你用的是什么浏览器?不过如果输入速度很快的话,好像是有些卡哦。
7 楼 admyefei 2009-11-22  
个人觉得javascript只是ria过渡时期的选择。想这么简单个FILTER,才50个州,都有严重的性能问题。
6 楼 admyefei 2009-11-22  
我怎么感觉很卡,性能有问题
5 楼 whaosoft 2009-11-20  
呃 lz做的不错呢 呵呵 前天我正在看lucene的高亮功能了 感觉不喜欢
4 楼 abruzzi 2009-11-18  
代码根据bluemeteor兄的建议做了一点修改,可以下载JFilter2.zip做测试,再次感谢bluemeteor,也希望有更多的意见,呵呵。
3 楼 abruzzi 2009-11-18  
bluemeteor 写道
有小建议,说出来讨论一下.XD

高亮的部分是否可以通过class来控制?

return "<span class='filterHighLight'>"+t+"</span>";

这样做可以,第一,通过外部的样式表来定义默认颜色,同时可以扩展,不仅控制背景,还可以很方便得扩展为控制字体。第二,将$(this).find("span").each替换成$(this).find(".filterHighLight").each,这样可以获得更大的应用性,现在这种方式如果元素本身在filter之前就包含span元素的话就会出现问题了


呵呵,这两点都提的非常好。关于第一点,我开始也写的是用css的class做Options,后来觉得用的时候有的人可能不习惯使用class,就写成color了,我觉得class更标准一些,下来改一下。第二点非常之正确,按照你说的这种方式可以消除潜在的bug.

谢谢了!
2 楼 bluemeteor 2009-11-18  
有小建议,说出来讨论一下.XD

高亮的部分是否可以通过class来控制?

return "<span class='filterHighLight'>"+t+"</span>";

这样做可以,第一,通过外部的样式表来定义默认颜色,同时可以扩展,不仅控制背景,还可以很方便得扩展为控制字体。第二,将$(this).find("span").each替换成$(this).find(".filterHighLight").each,这样可以获得更大的应用性,现在这种方式如果元素本身在filter之前就包含span元素的话就会出现问题了
1 楼 childrentown 2009-11-18  
看着不错,以前做过个类似的东西,IE好像有backspace的bug(keyup事件无效),不过例子中这个没有问题,也没看见有对IE的特殊处理,^_^?

相关推荐

    Jquery即时页面刷新过滤器示例

    本示例“Jquery即时页面刷新过滤器”旨在展示如何利用jQuery实现在表格中进行实时搜索过滤,提高用户体验。这个功能常见于数据量较大,需要用户快速查找特定信息的场景。 首先,我们需要理解jQuery的选择器。选择器...

    jQuery过滤器图片浏览.rar_average91i_jQuery过滤器图片浏览

    在本项目中,"jQuery过滤器图片浏览.rar_average91i_jQuery过滤器图片浏览" 提供了一个使用jQuery实现的图片浏览和过滤效果。这个功能主要用于网页中的图像展示,允许用户根据特定条件筛选和切换图片,提升用户体验...

    jquery ztree实现模糊查询功能,给树上的结点添加过滤器

    本篇文章将深入探讨如何利用jQuery ZTree实现模糊查询功能,并对树上的节点添加过滤器。 首先,我们要理解jQuery ZTree的核心特性之一是其强大的数据管理能力。通过配置数据参数,我们可以定制树的展示方式,包括...

    jquery.multiselect.filter

    "jQuery Multiselect Filter"是基于jQuery库的一个扩展,主要功能是在多选下拉框中添加实时搜索过滤功能。通过在下拉框上方添加一个输入框,用户可以输入关键词,快速找到并选择目标选项,极大地提高了操作效率。 2...

    jQuery过滤器图片浏览

    在"jQuery过滤器图片浏览"项目中,我们关注的是如何利用jQuery来实现图片的筛选和展示功能,使用户能够更方便地浏览和管理大量的图片资源。 在jQuery中,过滤器是一种强大的工具,可以用来选取满足特定条件的DOM...

    jquery多条件过滤

    在本文中,我们将深入探讨如何使用jQuery实现一个类似于京东商品的多条件过滤功能。这个功能允许用户根据多个筛选条件快速定位到他们感兴趣的商品,提高用户体验并优化网站的交互设计。 首先,我们需要理解jQuery的...

    jQuery图片筛选过滤器插件特效源码.zip

    本文将深入探讨基于jQuery的图片筛选过滤器插件的实现原理与源码分析。 首先,jQuery库的核心在于其选择器机制,它简化了DOM元素的选择和操作。在图片筛选过滤器中,我们通常会利用类选择器、ID选择器或者数据属性...

    jQuery实现的搜索列表过滤

    本主题聚焦于"jQuery实现的搜索列表过滤",这是一种常见且实用的功能,尤其适用于数据展示和用户交互丰富的Web应用。 首先,我们要理解搜索列表过滤的基本原理。在网页中,当用户在搜索框输入关键词时,页面上的...

    jQuery带过滤功能列表分类筛选插件代码

    本教程将深入讲解基于jQuery实现的带过滤功能的列表分类筛选插件,帮助开发者实现高效的数据展示和用户交互。** **一、jQuery基础知识** 在深入讨论jQuery列表筛选插件之前,我们需要了解jQuery的基本用法。jQuery...

    jQuery选项卡切换过滤器帅选图片浏览

    "jQuery选项卡切换过滤器帅选图片浏览"是一个利用jQuery实现的功能,通常用于创建交互式和动态的网页内容展示,特别是在图片浏览场景中。这个功能结合了选项卡切换和过滤器的概念,使用户能够更方便地浏览和筛选图片...

    扩展 jQuery TableSorter 插件 的搜索/过滤器插件

    3. **启用过滤器**:通过设置配置项 `filter` 为 `true` 或者使用 `$("table").tablesorter({ widgets: ['filter'] })` 启用过滤器。 4. **添加搜索框**:在表格上方添加输入框,通过事件监听实现搜索功能。 5. **...

    jQuery筛选列表过滤插件Filterizr

    jQuery筛选列表过滤插件Filterizr是一款强大的前端工具,主要用于实现动态筛选和排序列表项,尤其适用于展示项目集合或产品目录的网页。它以其简洁的API和丰富的自定义选项,为开发者提供了灵活且高效的解决方案。 ...

    jQuery选择器全解.

    选择器用于指定目标元素,而过滤器则进一步细化选择结果,通常用于从已选元素中筛选出符合特定条件的子集。两者可以灵活组合,形成复杂的选择表达式,满足多样化的DOM操作需求。 #### 三、基础选择器详解 1. **#id...

    Java模拟Jquery选择器

    通过`org.htmlparser.Parser`库,我们可以实现对HTML文档的解析,并利用自定义的过滤器来模拟jQuery选择器的功能。然而,由于JavaScript和Java在处理DOM上的本质差异,完全复制jQuery的功能可能会较为复杂,因此在...

    jquery分类搜索框带过滤器的搜索框

    在这个“jquery分类搜索框带过滤器的搜索框”项目中,我们主要探讨如何利用jQuery实现一个具有高级功能的搜索框,包括分类筛选和动态过滤。 首先,jQuery 提供的事件监听功能在这里起着关键作用。在描述中提到,当...

    jquery过滤 案例 demo

    这个方法可以接受多种参数类型,包括CSS选择器、函数或者元素对象,以实现不同的过滤需求。现在我们来详细解析这个强大的功能。 首先,让我们理解基本的CSS选择器过滤。假设你有一个包含多个li元素的ul列表,你可以...

    jsp实现下载excel,word,pdf,jgp,gif,xml,js过滤器实现文档.pdf

    标题中的“jsp实现下载excel,word,pdf,jpg,gif,xml,js过滤器实现文档.pdf”描述了一种使用JavaServer Pages(JSP)技术来处理文件下载的方法,特别是针对Excel、Word、PDF、JPEG、GIF、XML和JS等不同类型的文件。...

    jquery 实现查询 增加

    在“jQuery实现查询增加”的主题中,我们将深入探讨如何利用jQuery来构建动态的数据查询和添加功能。 一、jQuery基础 jQuery的核心在于它的选择器语法,它借鉴了CSS的规则,使得选取DOM元素变得异常简单。例如,`$...

    Datagrid-filter插件

    `Datagrid-filter`插件则进一步增强了Grid的功能,通过添加过滤器,使用户可以根据预定义或自定义的条件对数据进行筛选,减少了手动查找特定信息的时间。 在实际应用中,`Datagrid-filter`插件的使用非常简单。`...

    day42-Live User Filter(实时用户过滤器)

    在压缩包“day42-Live User Filter(实时用户过滤器)”中,可能包含了实现这个功能的HTML、CSS和JavaScript代码示例,通过学习和分析这些代码,你可以更深入地理解如何将这三个技术结合起来创建实时用户过滤器。...

Global site tag (gtag.js) - Google Analytics