javascript - 基于评级的搜索过滤器
问题描述
我正在尝试根据排名(存储在字符串中的数值)构建一个小过滤器,但我坚持使用部分代码。
预期行为
当用户单击该select
选项时,与所选值不匹配的元素必须隐藏(而不是删除)。
$(".notSearched").hide();
$("select").on("click", function() {
let selectedValue = this.value;
$('.card-wrap').each(function(selectedValue) {
console.log("sei qua");
if (selectedValue === "0") {
return
}
let rate = $(".restoName").find(".ratePlace").text();
let numRate = parseInt(rate);
if (rate !== selectedValue || rate !== (selectedValue + 0.5)) {
$(this).addClass("notSearched");
}
})
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="columnsContainer">
<div class="leftColumn">
<div class="filterResearch">
<select name="filter" id="searchFilter">
<option value="all">Apply a filter</option>
<option value="1">1 Star</option>
<option value="2">2 Stars</option>
<option value="3">3 Stars</option>
<option value="4">4 Stars</option>
<option value="5">5 Stars</option>
</select>
</div>
<div id="map"></div>
<div class="rightColumn" style="margin-top:50px;">
//Cards down below
<div class="card-grid">
<div class="card-wrap" id="">
<img src="https://image.ibb.co/k4SSPK/Spinaci_Green_Dark_Blue.jpg " class="photo">
<div class="restoName">
<h3>Restaurant Name Here</h3>
<p class="restoAddress">In questo posto ci andrà l'indirizzo del ristorante in questione, sarà una stringa lunga</p>
<p class="ratePlace">Rating: 4,5</p>
</div>
</div>
<div class="card-wrap" id=""><img src=" https://image.ibb.co/k4SSPK/Spinaci_Green_Dark_Blue.jpg" class="photo">
<div class="restoName">
<h3>Restaurant Name Here2</h3>
<p class="restoAddress">In questo posto ci andrà l'indirizzo del ristorante in questione, sarà una stringa lunga222</p>
<p class="ratePlace">Rating: 4,52</p>
</div>
</div>
<div class="card-wrap" id=""><img src=" https://image.ibb.co/k4SSPK/Spinaci_Green_Dark_Blue.jpg" class="photo">
<div class="restoName">
<h3>Restaurant Name Here3</h3>
<p class="restoAddress">In questo posto ci andrà l'indirizzo del ristorante in questione, sarà una stringa lunga333</p>
<p class="ratePlace">Rating: 4,53</p>
</div>
</div>
</div>
</div>
</div>
</div>
我在控制台中没有错误。在downvotes之前,我整个晚上都在搜索如何做,我会在这里链接一些关于它的链接。
解决方案
这里有几个问题:
- 在元素上使用
change
事件,而不是select
click
- 的外部实例在处理函数的参数列表中
selectedValue
不可用each()
,因此它成为当前元素的索引。这打破了逻辑。 text()
of.ratePlace
不是可以解析的整数,因为它以 text 为前缀Rating:
。因此 的输出parseInt
总是NaN
。要解决此问题,您可以将评级值放在其自己的data
属性中以防止混淆并需要解析该值- 您可以将检查放入
selectedValue
事件处理程序中,而不是each
,这样您可以在不需要时完全避免循环
您也可以使用notSelected
CSS 中的类来隐藏内容,然后toggleClass()
在 jQuery 中根据需要使用来隐藏/显示元素。说了这么多,试试这个:
$("select").on("change", function() {
let selectedValue = parseInt(this.value, 10) || 0;
if (selectedValue === 0)
return;
$('.card-wrap').each(function() {
let $cardWrap = $(this);
let rate = $cardWrap.find(".ratePlace").data('rating');
$cardWrap.toggleClass('notSearched', rate < selectedValue);
})
});
.notSearched {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="columnsContainer">
<div class="leftColumn">
<div class="filterResearch">
<select name="filter" id="searchFilter">
<option value="all">Apply a filter</option>
<option value="1">1 Star</option>
<option value="2">2 Stars</option>
<option value="3">3 Stars</option>
<option value="4">4 Stars</option>
<option value="5">5 Stars</option>
</select>
</div>
<div id="map"></div>
<div class="rightColumn" style="margin-top:50px;">
<div class="card-grid">
<div class="card-wrap">
<img src="https://image.ibb.co/k4SSPK/Spinaci_Green_Dark_Blue.jpg " class="photo">
<div class="restoName">
<h3>Restaurant Name Here</h3>
<p class="restoAddress">In questo posto ci andrà l'indirizzo del ristorante in questione, sarà una stringa lunga</p>
<p class="ratePlace" data-rating="1.5">Rating: 1,5</p>
</div>
</div>
<div class="card-wrap">
<img src=" https://image.ibb.co/k4SSPK/Spinaci_Green_Dark_Blue.jpg" class="photo">
<div class="restoName">
<h3>Restaurant Name Here2</h3>
<p class="restoAddress">In questo posto ci andrà l'indirizzo del ristorante in questione, sarà una stringa lunga222</p>
<p class="ratePlace" data-rating="3.52">Rating: 3,52</p>
</div>
</div>
<div class="card-wrap">
<img src=" https://image.ibb.co/k4SSPK/Spinaci_Green_Dark_Blue.jpg" class="photo">
<div class="restoName">
<h3>Restaurant Name Here3</h3>
<p class="restoAddress">In questo posto ci andrà l'indirizzo del ristorante in questione, sarà una stringa lunga333</p>
<p class="ratePlace" data-rating="4.53">Rating: 4,53</p>
</div>
</div>
</div>
</div>
</div>
</div>
请注意,我更改了一些评分以使更改下拉列表的效果更加明显。
推荐阅读
- git - 如何使用 GUI 比较两个不同提交中的文件
- plpgsql - PLPGSQL 中带引号的游戏
- javascript - 我可以将屏幕阅读器友好的标签添加到 HTML5 Adobe Animate 文档吗?
- cassandra - 卡桑德拉没有运行。拒绝连接
- angular - *ngFor 中的动态角度选择选项
- javascript - 用另一个对象ReactJS替换数组中的对象
- javascript - 如何将整数列表乘以html中的一个字符串?
- javascript - 从特定位置之间的数组中获取最大值
- reactjs - 我应该使用我的钩子来显示/隐藏组件的链接没有按预期工作
- c# - 如何将 where 子句添加到实体框架查询