Javascript 如何使用JQuery在图库上设置搜索过滤器功能?它需要隐藏与实时关键项不匹配的结果
我正在创建一个带有搜索过滤器功能的图库。搜索过滤器应该根据输入的每个键过滤掉显示的缩略图。搜索基于存储在标题标签中的img标题。例如,如果我键入“la”,则在输入“lake”之前,标题中包含匹配文本的所有图像都应出现 我的脚本包含存储搜索词和图像标题的变量,但不确定我是否正确。然后,我添加了一个函数,其中包含一个用于搜索项的变量。在我的日志中,每个关键字条目都会实时显示搜索词 我添加了console.log$img==$searchTerm;确保我的思路正确,搜索条目将返回true,但它会不断返回false。这可能不是最理想/最有效的方法,但我的想法是,在操作DOM之前,应该先记录正确的结果 除了我已经在使用的lightbox插件之外,我宁愿不使用插件。我想了解如何添加搜索功能以及它是如何工作的 HTML示例Javascript 如何使用JQuery在图库上设置搜索过滤器功能?它需要隐藏与实时关键项不匹配的结果,javascript,jquery,image-gallery,searchbar,Javascript,Jquery,Image Gallery,Searchbar,我正在创建一个带有搜索过滤器功能的图库。搜索过滤器应该根据输入的每个键过滤掉显示的缩略图。搜索基于存储在标题标签中的img标题。例如,如果我键入“la”,则在输入“lake”之前,标题中包含匹配文本的所有图像都应出现 我的脚本包含存储搜索词和图像标题的变量,但不确定我是否正确。然后,我添加了一个函数,其中包含一个用于搜索项的变量。在我的日志中,每个关键字条目都会实时显示搜索词 我添加了console.log$img==$searchTerm;确保我的思路正确,搜索条目将返回true,但它会不断返
再次感谢您的任何意见 您喜欢这项工作吗
const $searchBar = $('#searchForm > input');
const $img = $('.imageContainer > a[title]');
$searchBar.on('keyup', function(event) {
var searchTerm = $(this).val().toLowerCase();
//I removed the $ as it is not a jQuery object, but it doesn't really matter
$img.show(); //show them all first
$img.each(function() { //no need for $imgList as it is already an array
var title = $(this).attr('title').toLowerCase();
if (!title.includes(searchTerm)) { //do you need to support IE? use indexOf if so
$(this).hide(); //hide if not a match
}
});
});
如果您需要支持IE,类似这样的功能将取代includes函数
if (title.indexOf(searchTerm)) {
$(this).hide();
}
更新2:
以下是更新的代码,用于处理只输入空格而不输入文本的人,以及IE修复程序:
const $searchBar = $('#searchForm > input');
const $img = $('.imageContainer > a[title]');
$searchBar.on('keyup', function(event) {
var searchTerm = $.trim($(this).val().toLowerCase()); //we trim this to remove whitespace
$img.show();
if (searchTerm) {
$img.each(function() {
var title = $.trim($(this).attr('title').toLowerCase()); //and we trim this too
if (title.indexOf(searchTerm)) {
$(this).hide();
}
});
}
});
我们获取搜索输入值,然后将其与标题进行比较,然后隐藏与字母不匹配的内容,无需键入单词标题的所有字母:
document.getElementById('search').addEventListener('keyup', function(e) {
let term = e.target.value;
let term = e.target.value.toLowerCase();
if(term) {
toggleDisplay('none')
let elements = document.getElementsByTagName('li');
for(let i=0; i<elements.length; i++){
if(elements[i].textContent.toLowerCase().includes(term)) {
elements[i].closest('.card').style.display = 'block';
}
}
}
else {
toggleDisplay('inline-block')
}
});
function toggleDisplay(display) {
let cards = document.querySelectorAll('.card');
for(let i=0; i< cards.length; i++){
cards[i].style.display = display;
}
}
非常感谢你!我已经做了好几个小时了。它工作完美!我真的很感谢你的回答和帮助,尤其是笔记。我有一个问题,它的元素隐藏在backspace中,所以我修改它为!title.includeSearchTerm&&searchTerm!==空,这是有效的。这是首选方法还是错误代码?另外,关于indexOf,我需要一些澄清。我试过了!title.includeSearchTerm | |!title.indexOfsearchTerm&&。。。还有…| |!标题.索引$imgList&。。。。第二个脚本在Chrome上运行,但不是IE,所以我尝试了…| |!标题.索引$img&&。。。。如果我理解正确,我会根据所有的标题标签检查搜索,对吗?再次感谢!当你退格时一切都隐藏了?这不应该发生,因为我们先显示所有内容,然后只隐藏不匹配的内容。你能多告诉我一点正在发生的事吗?我还为indexOf函数添加了一些额外的代码。您不是将它与数组进行比较,而是每个数组的标题(如果有帮助的话)。使用普通Javascript是个好主意。如果我们将CSS引入其中,那么类切换可能比更改显示样式更好。好主意。
const $searchBar = $('#searchForm > input');
const $img = $('.imageContainer > a[title]');
$searchBar.on('keyup', function(event) {
var searchTerm = $.trim($(this).val().toLowerCase()); //we trim this to remove whitespace
$img.show();
if (searchTerm) {
$img.each(function() {
var title = $.trim($(this).attr('title').toLowerCase()); //and we trim this too
if (title.indexOf(searchTerm)) {
$(this).hide();
}
});
}
});
document.getElementById('search').addEventListener('keyup', function(e) {
let term = e.target.value;
let term = e.target.value.toLowerCase();
if(term) {
toggleDisplay('none')
let elements = document.getElementsByTagName('li');
for(let i=0; i<elements.length; i++){
if(elements[i].textContent.toLowerCase().includes(term)) {
elements[i].closest('.card').style.display = 'block';
}
}
}
else {
toggleDisplay('inline-block')
}
});
function toggleDisplay(display) {
let cards = document.querySelectorAll('.card');
for(let i=0; i< cards.length; i++){
cards[i].style.display = display;
}
}
.container {
margin: 0 auto;
}
@media (min-width: 576px) {.container {max-width: 540px;}}
@media (min-width: 768px) {.container {max-width: 760px;}}
@media (min-width: 992px) {.container {max-width: 960px;}}
@media (min-width: 1200px) {.container {max-width: 1190px;}}
.form-container {
text-align: center;
margin: 30px 0;
}
.search-input {
width: 250px;
height: 30px;
}
.card {
background-color: #ddd;
width: 30%;
margin: 0 1%;
height: 100px;
float: right;
overflow: hidden;
margin-bottom: 30px;
}
.card:hover .card-ul {
transform: translateX(0%);
}
.card-ul {
list-style: none;
display: flex;
justify-content: space-between;
transform: translateX(100%);
transition: transform 0.3s;
}
.card-li {
background-color: #fff;
padding: 3px 5px;
border-radius: 5px;
margin: 10px;
}
<div class="container">
<div class="form-container">
<form id="search-form">
<input type="text" id="search" class="search-input">
</form>
</div>
<div class="card-container">
<div class="card">
<a href="">
<div class="img-div">
<img class="img" src="...">
<div class="desc">
<ul class="card-ul">
<li class="card-li black">Black</li>
<li class="card-li yellow">Yellow</li>
<li class="card-li jwhite">White</li>
</ul>
<p>text</p>
</div>
</div>
<div class="title">
<p>text</p>
</div>
</a>
</div>
<div class="card">
<a href="">
<div class="img-div">
<img class="img" src="...">
<div class="desc">
<ul class="card-ul">
<li class="card-li black">Red</li>
<li class="card-li yellow">Green</li>
<li class="card-li jwhite">White</li>
</ul>
<p>text</p>
</div>
</div>
<div class="title">
<p>text</p>
</div>
</a>
</div>
<div class="card">
<a href="">
<div class="img-div">
<img class="img" src="...">
<div class="desc">
<ul class="card-ul">
<li class="card-li black">Denim</li>
<li class="card-li yellow">Amaranth</li>
<li class="card-li jwhite">Celadon</li>
</ul>
<p>text</p>
</div>
</div>
<div class="title">
<p>text</p>
</div>
</a>
</div>
<div class="card">
<a href="">
<div class="img-div">
<img class="img" src="...">
<div class="desc">
<ul class="card-ul">
<li class="card-li black">Brown</li>
<li class="card-li yellow">Capri</li>
<li class="card-li jwhite">Camel</li>
</ul>
<p>text</p>
</div>
</div>
<div class="title">
<p>text</p>
</div>
</a>
</div>
<div class="card">
<a href="">
<div class="img-div">
<img class="img" src="...">
<div class="desc">
<ul class="card-ul">
<li class="card-li black">Brown</li>
<li class="card-li yellow">Blond</li>
<li class="card-li jwhite">Blue</li>
</ul>
<p>text</p>
</div>
</div>
<div class="title">
<p>text</p>
</div>
</a>
</div>
<div class="card">
<a href="">
<div class="img-div">
<img class="img" src="...">
<div class="desc">
<ul class="card-ul">
<li class="card-li black">Beaver</li>
<li class="card-li yellow">Aqua</li>
<li class="card-li jwhite">Pink</li>
</ul>
<p>text</p>
</div>
</div>
<div class="title">
<p>text</p>
</div>
</a>
</div>
<div class="card">
<a href="">
<div class="img-div">
<img class="img" src="...">
<div class="desc">
<ul class="card-ul">
<li class="card-li black">Amber</li>
<li class="card-li yellow">Apricot</li>
<li class="card-li jwhite">Amethyst</li>
</ul>
<p>text</p>
</div>
</div>
<div class="title">
<p>text</p>
</div>
</a>
</div>
</div>
</div>