jQuery复选框筛选逻辑异常:多选周几复选框无结果,需实现或条件匹配
jQuery复选框筛选逻辑异常:多选周几复选框无结果,需实现或条件匹配
嘿,我完全懂你碰到的问题——现在你的代码把选中的日期和时间条件全塞进同一个数组里,过滤时相当于要求卡片同时满足所有选中项,这就导致选了周一和周二时,没有卡片能同时属于两天,自然就没结果了。咱们得把日期和时间的条件分开处理,用或逻辑搞定同类型的条件,再用与逻辑把两类条件结合起来。
下面是修改后的完整代码,我给你拆解下关键逻辑:
$('form#filter').on('change', function() { // 分开存储日期和时间的选中值,避免混在一起导致逻辑混乱 var selectedDays = []; var selectedTimes = []; // 收集所有选中的日期选项 $("form#filter .checkDays input:checked").each(function() { selectedDays.push($(this).val()); }); // 收集所有选中的时间选项 $("form#filter .checkTime input:checked").each(function() { selectedTimes.push($(this).val()); }); // 没有任何筛选条件时,直接显示所有卡片 if (selectedDays.length === 0 && selectedTimes.length === 0) { $('.card').removeClass('is-hidden').fadeIn(); } else { $('.card').each(function() { const $card = $(this); // 这里假设你的卡片用data-day和data-time存储对应属性,根据实际HTML结构调整即可 const cardDay = $card.data('day'); const cardTime = $card.data('time'); // 日期匹配逻辑:没选日期则默认满足;选了的话,卡片日期在选中列表里就算匹配(或逻辑) const dayMatch = selectedDays.length === 0 || selectedDays.includes(cardDay); // 时间匹配逻辑和日期一致 const timeMatch = selectedTimes.length === 0 || selectedTimes.includes(cardTime); // 最终需要同时满足日期和时间的匹配要求(与逻辑),显示/隐藏卡片 if (dayMatch && timeMatch) { $card.removeClass('is-hidden').fadeIn(); } else { $card.addClass('is-hidden').fadeOut(); } }); } });
核心调整说明:
- 拆分条件存储:把日期和时间的选中项分开存放,避免不同类型的条件互相干扰;
- 或逻辑处理同类型选项:比如多选日期时,只要卡片属于任意一个选中的日期,就判定日期条件满足;如果没选日期,默认所有卡片都符合日期要求;
- 与逻辑结合两类条件:最终要卡片同时满足日期和时间的匹配规则(如果有对应条件的话),既保证同类型选项的“或”,又保证不同类型选项的“与”。
如果你的卡片支持同时关联多个日期(比如一个卡片既属于周一又属于周二),只需要把cardDay改成数组形式,然后用selectedDays.some(day => cardDay.includes(day))来判断匹配就行,灵活调整适配你的实际结构~
备注:内容来源于stack exchange,提问作者onesixty
相关产品推荐
相关产品推荐

