公司产品的一个新功能中涉及到一个过滤器:通过关键字快速的对结果集进行过滤,获得比较少的结果,方便用户选择。在网上找了找,有很多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
分享到:
相关推荐
自举表过滤器这是jquery插件的扩展,基于另一个扩展 ,它为服务器端和客户端提供了列过滤器控件。参考 -v.3用于选择过滤器控件 -v.1.10用于datepicker过滤器控件用法步骤1 包括jQuery,Bootstrap,Bootstrap-table,...
这就是jquery选择器的过滤器。 空说无用,我们展示一下 代码如下: <body> 你好啊,今天及多大了啊</p> <p><span>为什么要告诉你</span></p> </body> 如果我们要选择有一个子元素的元素,平常我都是这么...
作为替代方案,您可以使用 DataTables Column 过滤器插件,其中封装了来自 DataTables 站点的大多数代码示例。 执行 要实现和自定义列过滤,您需要使用 DataTables 插件和列过滤插件,并使用基本的 !dataTable 插件...
$()方法里面支持的语法又包括3大类,分别是表达式(包括类表达式.,id表达式#,元素表达式等)、符号(包括后代符号space,next符号+等)、过滤器(包括:过滤器和[]过滤器)。 通过以上3种的组合,“查询”得到想要操作的...
(24)选择表格中第3行,标题行不算(要求用nth-child()过滤器) 上机任务3 用chrome打开dom.sample2.html页面,该页面中内嵌有几个CSS类:.red .green .blue .yellow .thickBorder .seeThrough 在chrome的控制台...
表过滤器基于 Bootstrap + JQuery 的 HTML 表格过滤器插件,您只需将表格的 id 传递给 tableFilter.filter('id of the table') 方法,点击此按钮将打开一个过滤器弹出窗口一个二 1 三1 one2 二 2 三 2 一个3 二三三...
配置web.xml文件时过滤器配置的不同, <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>, 新版本中都是过时的了,采取该过滤器, <filter-class>org.apache.struts2.dispatcher.ng...
3. 选择器 37 3.1 基本 37 3.1.1 #id 37 3.1.2 element 38 3.1.3 .class 38 3.1.4 * 39 3.1.5 selector1,selector2,selectorN 39 3.2 层级 40 3.2.1 ancestor descendant 40 3.2.2 41 3.2.3 prev + next 41 3.2.4 ...
filter定义的过滤器可以局部,可以全局的下面就直接说全局的 老样子还是等先注册一个全局的过滤器关键字(filter) 全局的注册过滤器是在main.js这个文件里,当然也可以单独的一个js文件里 Vue.
以上的这些功能,通过一种名为责任链或者拦截器或者过滤器(语义上的区别而技术上没有什么区别,知道做了什么就行了)的设计模式可以实现,那么就来看看什么是责任链的设计模式。 以下内容参考北京尚学堂的马士兵...
FXTableFilter(快速可扩展表过滤器) FX TableFilter 是一个 JQuery 插件,可为 HTML 表格添加过滤功能。 这个插件是对 PicNet 表过滤器的重写,它旨在更快和更可扩展。 它适用于更大的表格,并且可以添加自定义...
课程涵盖:Servlet程序、Filter过滤器、Listener监听器、JSP页面、EL表达式、JSTL标签库、jQuery框架、Cookie技术、Session会话、JSON使用、Ajax请求等全部Web开发核心技术点,并在讲解知识点过程中带领大家完成一个...
filter(expr|obj|ele|fn) is(expr|obj|ele|fn)1.6* map(callback) has(expr|ele) not(expr|ele|fn) slice(start,[end]) 查找 children([expr]) closest(expr,[con]|obj|ele)1.6* find(expr|obj|ele)1.6* ...
jQuery过滤器JSON 这个jQuery插件是一个实用程序,可让您根据属性过滤JSON。 您还可以具有属性/值匹配项,并且仅返回与传入值匹配的那些属性值。 但是,您可以根据各种参数(例如startWith或checkContains,match...
数据表-列-过滤器 JQuery DataTables 的高级列过滤插件
表格插件的jQuery过滤器该插件可以在HTML表中进行搜索和过滤。 如果单元格具有格式化的数字值,则插件会将其转换为简单数字并与过滤器值进行比较。 因此,如果要在过滤器中输入1500之类的内容,脚本将显示具有1500、...
jui_filter_rules是一个jQuery插件,可用于将过滤器规则创建或设置为JSON对象并获取相关的WHERE SQL 。 完全可配置的。 本地化支持。 引导程序支持。 需要jquery(> = 1.8) 无需使用moment.js和jquery-ui,但...
02.jQuery选择器 03.jQuery语法 04.jQuery方法1 05.jQuery方法2 06.jQuery选择器(基础)至选择器(表单) 07.选择器(表单)至属性(CSS类) 08.属性(CSS类)至属性(值) 09.属性(值)至过滤(filter) 10.过滤(filter)至查找...
filter-by-tag.js根据 html 内容中的数据标签filter-by-tag.js生成过滤器工具栏。 实现细节请参见: 如何在您自己的页面中使用该组件的example可以在example目录中找到,或者。 安装 从下载。 将filter-by-tag....