js前端 多条件筛选查询
一、前言
在做项目中,遇到多条件筛选案例。实现完成以后,我将我做的代码分享在这里,希望可以帮助到其他朋友。
二、效果截图

三、实现代码
首先我先类型、类别、职位分成三块来处理,如果传到服务器端的话,就是三个参数。
html部分:
<form action="@Url.Action()" method="get" id="formAction">
<div class="type-table">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>类型:</td>
<td><span data-cate="all" data-type="type" class="active">全部</span> <span data-cate="qz" data-type="qz">全职</span> <span data-cate="jz" data-type="jz">兼职</span></td>
</tr>
<tr style="display:none;" id="qtqzNone"></tr>
<tr style="display:none" id="qtqz">
<td>类别:</td>
<td><span data-cate="all" data-category="category" class="active">全部</span> <span data-cate="mrmf" data-category="mrmf">美容/美发</span> <span data-cate="bmys" data-category="bmys">保姆/月嫂</span> <span data-cate="dnit" data-category="dnit">电脑/IT</span> <span data-cate="bgwy" data-category="bgwy">办公文员</span> <span data-cate="zsyl" data-category="zsyl">诊所医疗</span> <span data-cate="yyy" data-category="yyy">营业员</span> <span data-cate="mj" data-category="mj">美甲</span> <span data-cate="sj" data-category="sj">司机</span> <span data-cate="yc" data-category="yc">衣产</span> <span data-cate="jbktv" data-category="jbktv">酒吧/KTV</span> <span data-cate="zx" data-category="zx">装修</span> <span data-cate="qt" data-category="qt">其他</span> </td>
</tr>
<tr style="display:none;" id="cyqzCate">
<td>类别:</td>
<td><span data-cate="all" data-category="category" class="active">全部</span> <span data-cate="zc" data-category="zc">中餐</span> <span data-cate="rc" data-category="rc">日餐</span> <span data-cate="fqg" data-category="fqg">夫妻工</span> <span data-cate="qtcy" data-category="qtcy">其他餐饮</span></td>
</tr>
<tr style="display:none;" id="cyqzCates">
<td>职位:</td>
<td><span data-cate="jl" data-position="jl">经理</span> <span data-cate="jdh" data-position="jdh">接电话</span> <span data-cate="qt" data-position="qt">企台</span> <span data-cate="dbdw" data-position="dbdw">打包/带位</span> <span data-cate="kt" data-position="kt">看台</span> <span data-cate="dc" data-position="dc">大厨</span> <span data-cate="cg" data-position="cg">炒锅</span> <span data-cate="bc" data-position="bc">帮炒</span> <span data-cate="dz" data-position="dz">打杂</span> <span data-cate="yg" data-position="yg">油锅</span> <span data-cate="sc" data-position="sc">送餐</span> <span data-cate="qt" data-position="qt">其他</span></td>
</tr>
</table>
</div>
<div class="search">
<input type="hidden" name="cateId" value="@Request.QueryString["cateId"]" />
<input type="text" name="filter" value="@Request.QueryString["filter"]" placeholder="请输入关键字" />
<input type="hidden" name="posParam" id="posParam" value="@Request.QueryString["posParam"]" />
<input type="hidden" name="cateParam" id="cateParam" value="@Request.QueryString["cateParam"]" />
<input type="hidden" name="typeParam" id="typeParam" value="@Request.QueryString["typeParam"]" />
<button type="submit">搜索</button>
</div>
<div class="area">
区域:<select id="AreaIds" name="AreaIds"></select>
<input id="areaId" name="areaId" type="hidden" value="@Request.QueryString["areaId"]" />
</div>
</form>
js部分:
$(function () {
/**类型 */
var typeParam = [];
/**类别*/
var cateParam = [];
/**职位 */
var posParam = [];
/**回填选中项*/ /*这里我说明一下:这里是我们已经提交了参数,在从浏览器的 url 获取参数,通 data-type 来回填该选项是否是选中*/
var param = getUrlParam();
if (param && param.typeParam) {
typeParam = param.typeParam.split('A');
for (var i = 0; i < typeParam.length; i++) {
$('[data-type="' + typeParam[i] + '"]').addClass('active');
}
$('[data-type="type"]').removeClass('active');
}
if (param && param.cateParam) {
cateParam = param.cateParam.split('A');
for (var i = 0; i < cateParam.length; i++) {
$('[data-category="' + cateParam[i] + '"]').addClass('active');
}
$('[data-category="category"]').removeClass('active');
}
if (param && param.posParam) {
posParam = param.posParam.split('A');
for (var i = 0; i < posParam.length; i++) {
$('[data-position="' + posParam[i] + '"]').addClass('active');
}
}
/* 到这里 回填结束 */
/** 这里是选线的点击事件 **/
$(".type-table span").click(function () {
var me = $(this);
var type = me.attr('data-type');
var category = me.attr('data-category');
var position = me.attr('data-position');
var className = me.attr("class");
var cate = me.attr('data-cate');
/*类型判断*/
if (type != undefined) {
if (type == "type") {
$('.type-table [data-cate]').removeClass('active'); typeParam = [];
} else {
$('[data-type="type"]').removeClass('active');
if (className == 'active') {
if (typeParam.indexOf(cate) > -1)
typeParam.remove(cate);
} else {
if (typeParam.indexOf(cate) == -1)
typeParam.push(cate);
}
}
$("#typeParam").val(typeParam.toString().replace(re, "A"));
}
/*类别判断*/
if (category != undefined) {
if (category == "category") {
$('.type-table [data-category]').removeClass('active'); cateParam = [];
} else {
$('[data-category="category"]').removeClass('active');
if (className == 'active') {
if (cateParam.indexOf(cate) > -1)
cateParam.remove(cate);
} else {
if (cateParam.indexOf(cate) == -1)
cateParam.push(cate);
}
}
$("#cateParam").val(cateParam.toString().replace(re, "A"));
}
/*职位判断*/
if (position != undefined) {
if (className == 'active') {
if (posParam.indexOf(cate) > -1) posParam.remove(cate);
} else {
if (posParam.indexOf(cate) == -1) posParam.push(cate);
}
$("#posParam").val(posParam.toString().replace(re, "A"));
}
/************ 选项卡点击事件结束 ****************/
if (className == 'active') {
me.removeClass("active");
} else {
me.addClass("active");
}
var re = new RegExp(",", "g"); //定义正则表达式 这里是我用来分隔参数用的
if (typeParam.length > 0) {
$("#typeParam").val(typeParam.toString().replace(re, "A"));
}
if (cateParam.length > 0) {
$("#cateParam").val(cateParam.toString().replace(re, "A"));
}
if (posParam.length > 0) {
$("#posParam").val(posParam.toString().replace(re, "A"));
}
});
});
Array.prototype.indexOf = function (val) {
for (var i = 0; i < this.length; i++) {
if (this[i] == val) return i;
}
return -1;
};
Array.prototype.remove = function (val) {
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
}
};
附件 getUrlParam() 方法实现代码:主要是获取 URL 中参数的 Key 和 value
/**
* 获取浏览器参数
* @param {any} url
*/
function getUrlParam(url) {
var queryArr = (url && url.substr(url.indexOf('?') + 1).split('&')) ||
location.search.substr(1).split('&'),
query = {};
for (var i = 0, len = queryArr.length; i < len; i++) {
var key = queryArr[i].split('=')[0],
val = queryArr[i].split('=')[1];
if (query.hasOwnProperty(key)) {
if (!Array.isArray(query[key])) {
query[key] = [query[key]]
query[key].push(val)
} else {
query[key].push(val)
}
continue
}
query[key] = val
}
return query
}
四、结语
分享到这里结束,可能代码有点多不好看懂。不过没关系,有不懂的地方可以联系我,我们一起学习一起进步!
js前端 多条件筛选查询的更多相关文章
- Django多条件筛选查询
转自:https://www.jianshu.com/p/a86281df530e Django多条件筛选查询 主模型只存在外键一对多关系 模型设计 # 快捷筛选状态 class Status(mod ...
- HBase多条件筛选查询方案
最近的项目需要使用Hbase做实时查询,由于Hbase只支持一级索引,也就是使用rowkey作为索引查询,所以对于多条件筛选查询的支持不够,在不建立二级索引的情况下,只能使用Hbase API中提供的 ...
- c#中如何不通过后台直接用js筛选gridview中的数据条件筛选查询?
js: //条件筛选 var showstate = true; function imagechange() { if (showstate) { $('#_toggle').hide(500, f ...
- sql条件为空查询全部,不为空按条件查询以及多条件筛选查询。
procedure queryLackLonOrLatTdCell(i_region_name varchar2, i_state varchar2) is begin select region_n ...
- js 根据 数组条件 简单查询的方法临时保存
let array = [{ date: '2016-05-02', name: 'Ethan', status: 'success', total: '81' }, { date: '2016-05 ...
- JS前端数据多条件筛选(商品搜索)
有时候也会需要在前端进行数据筛选,增强交互体验.当数据可用的筛选条件较多时,把逻辑写死会给后期维护带来很大麻烦.下面是我自己写的一个简单的筛选器,筛选条件可以根据数据包含的字段动态设置. 仿照京东的筛 ...
- JDBC动态查询MySQL中的表(按条件筛选)
动态查询实现按条件筛选.PreparedStatement 准备语句指定要查询的表头列,.setString()通过赋值指定行,.executeQuery()执行语句 在数据库test里先创建表sch ...
- Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询
在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...
- 齐博x1where 标签动态变量查询/where 实现条件筛选与数据关联
大家可能对union参数不太习惯的话,也可以用where语句加入动态变量查询,比如 where="fid=$fid&uid=$info[uid]&pid>=$info. ...
随机推荐
- ubuntu 停留开机界面解决方法
1 问题 Ubuntu 启动时卡在开机界面上 2 修复 $ sudo apt-get -y reinstall ubuntu-desktop*
- C#中的线程(一)入门 转载
文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 转载:http://www.cnblogs.com/miniwiki/archive/2010 ...
- angular2-cli 安装
1.如果你之前安装失败过,最好在安装angular-cli之前先卸载干净,用以下两句: npm uninstall -g angular-cli npm cache clean 2.设置淘宝镜像,国 ...
- ROS常用工具
先将这个package放到工作空间的 src 目录中, 链接:点击打开链接 密码:u98p 然后在工作空间中加入依赖, rosdep install --from-paths src --ignore ...
- bochs调试命令
Bochs几条基本指令: 通过物理地址查看内存时,可以不加参数'/nuf': 其中n指定显示的单元数,默认是1: u 指定每个显示单元的大小(b表示字节.h表示字(2字节).w表示双字(4字节)),默 ...
- 不用中间变量交换a和b的值?
a = b = a = a+b b = a-b a = a-b print(a,b) a = b = a = a^b b = b^a a = a^b print(a,b) a = b = a,b = ...
- Python基础之各种推导式玩法
一.推导式套路 除了我们之前所学习的列表推导式和生成器表达式之外,还有字典推导式.集合推导式等等. 下面就是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. variable = [out ...
- GFS中元数据的管理
GFS 元数据(metadata)中包含三部分: GFS元数据的管理方式: 1.文件的命名空间和块的命名空间: 采用持久化的方式. 对于文件和块的命名空间以及从文件到块的映射:通过向操作日志登记修改而 ...
- 深入理解JVM虚拟机1:JVM内存的结构与永久代的消失
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...
- CentOS 6.5系统中mysql数据库还原后出现无法读表
图形化工具还原提示如下: 命令行输入 mysql> use netmanage; Database changed mysql> show tables; ERROR 1018 (H ...