使用jQuery过滤列表,当输入多个单词时,使用AND条件
Filtering a list with jQuery, when multiple words are entered as input, using AND condition
我正在尝试过滤基于用户输入的列表,使用jQuery。到目前为止,它工作得很好,但我希望能够在用户输入多个单词时充分过滤列表,使用相当于AND的条件。
例如,如果用户输入"Toyota manual",仍然应该显示以下两个元素:
- 丰田Echo 2001手册
- 丰田卡罗拉2006手动版
目前,对于当前的jsFiddle,过滤器查找确切的字符串("Toyota manual"),因此没有找到。我如何修改我的代码使其按预期工作?
HTML/JS
<label for="filterCars">Filtrer la liste des indicateurs :</label>
<input id="filterCars" class="txtfilterCars" type="text" name="txtRecherche">
<ul class="filterCars">
<li class="elemCar">Ford escort 2001 manual</li>
<li class="elemCar">Ford escort 2002 automatic</li>
<li class="elemCar">Dodge Caravan 2001 automatic</li>
<li class="elemCar">Hyundai Excel 2003 manual</li>
<li class="elemCar">Toyota Echo 2001 manual</li>
<li class="elemCar">Toyota Corolla 2006 manual</li>
<li class="elemCar">Hyundai Accent 2009 Automatic</li>
</ul>
$(document).ready(function () {
function noaccent(myString) {
temp = myString.replace(/[àâä]/g, "a");
temp = temp.replace(/[éèêë]/g, "e");
temp = temp.replace(/[îï]/g, "i");
temp = temp.replace(/[ôö]/g, "o");
temp = temp.replace(/[ùûü]/g, "u");
temp = myString.replace(/[ÀÂÄ]/g, "A");
temp = temp.replace(/[ÉÈÊË]/g, "E");
temp = temp.replace(/[ÎÏ]/g, "I");
temp = temp.replace(/[ÔÖ]/g, "O");
temp = temp.replace(/[ÙÛÜ]/g, "U");
return temp;
}
$("#filterCars").keyup(
function () {
var filter = noaccent($(this).val()),
count = 0;
$(".filterCars li.elemCar").each(
function () {
if (noaccent($(this).text()).search(new RegExp(filter, "i")) < 0) {
$(this).addClass("cacheElementFiltre");
} else if (!($(this).hasClass("cacheElement"))) {
$(this).removeClass("cacheElementFiltre");
count++;
}
});
});
});
CSS //CSS
.cacheElement, .cacheElementFiltre {
display: none;
}
https://jsfiddle.net/f52o3kpd/在这种情况下,您需要使用更高级的正则表达式:
$("#filterCars").keyup(function () {
var text = $.trim(noaccent($(this).val())),
filter = '^(?=.*''b' + text.split(/'s+/).join('''b)(?=.*''b') + ').*$',
reg = RegExp(filter, 'i'),
count = 0;
$(".filterCars li.elemCar").each(function () {
if (!reg.test(noaccent($(this).text()))) {
$(this).addClass("cacheElementFiltre");
} else if (!($(this).hasClass("cacheElement"))) {
$(this).removeClass("cacheElementFiltre");
count++;
}
});
});
Regexp看起来很复杂,但它允许按任意顺序过滤单词:"Ford 2001"或"2001 Ford"。
演示:https://jsfiddle.net/f52o3kpd/2/
相关文章:
- 在指令控制器中使用$attrs时出现问题
- CasperJS在使用sendKeys时不会上传文件
- 锚点元素不't使用svg时,请打开EDGE上的href
- 当使用Watchify时,Browserify+Babelify Gulp任务没有终止
- 如何在使用组件时定义模板url
- 在gump和nodejs中使用Typescript时,未定义对require和exports的引用
- 使用nunjucks时发生块结束错误
- 如果类不是一个选项,如何在使用 jQuery 时控制(避免)嵌套 html 元素的样式
- 使用AngularJs时,如何在img标记具有src-attr时设置数据src
- 使用prompt时反转数组
- 当#在iFrame中使用HTML时,阻止页面移动
- 使用append时复制内容的DOM
- 使用参数时出现Javascript Typedef错误
- Rails:如何获取当前用户'使用Heroku时的时区
- 在控制器上使用“$watch”时,为什么不更新此隐藏字段
- 在Bookshelf.js中使用“withRelated”时指定备用“id”
- 在IntelliJ IDEA中,如何将JS文件从“;查找用法“;使用TypeScript时的结果
- Django在使用AJAX时没有接收到新的查询字符串
- 如何在使用webpack时不解决需求
- 使用jQuery过滤列表,当输入多个单词时,使用AND条件