英文:
Updating text to match .length is always one behind
问题
我有一些在我的网站上使用的过滤器,并且我有一个文本块,我想更新其中的活动过滤器数量,以便用户始终可以知道应用了多少个,即使过滤器已关闭。
问题是,无论哪种方式,我的计数总是落后一个。需要点击一次更多才能得到正确的数字。
我认为问题在于,数字是根据当前的数量更新的,而不是在点击发生后更新的,但我无法理解如何重新构建以解决这个问题。
以下是我的代码:
let countFilter = 0;
function updateFilterCount() {
let countFilter = $(".is-active").length;
$(".caps.count").text(countFilter);
if (countFilter > 0) {
$(".filtered-text").addClass("active");
$(".caps.all.active").removeClass("active");
} else {
$(".filtered-text.active").removeClass("active");
$(".caps.all").addClass("active");
}
}
updateFilterCount();
$(".fltr, .fltr-label, .filter_drawer, .button.ghost.filter__button.active").on(
"click",
function () {
updateFilterCount();
}
);
英文:
I have some fitlering being used on my site and I have a text block that I would like updated with the number of active filters so the user can always tell how many are applied even if the filters are closed.
The issue is, my count is always one behind either way. It's taking one more click to get the correct number.
I would assume the number is updating with the CURRENT number as opposed to updating AFTER the click has occured, but I can't wrap my brain around how to restructure to address that.
Here's my code:
let countFilter = 0;
function updateFilterCount() {
let countFilter = $(".is-active").length;
$(".caps.count").text(countFilter);
if (countFilter > 0) {
$(".filtered-text").addClass("active");
$(".caps.all.active").removeClass("active");
} else {
$(".filtered-text.active").removeClass("active");
$(".caps.all").addClass("active");
}
}
updateFilterCount();
$(".fltr, .fltr-label, .filter_drawer, .button.ghost.filter__button.active").on(
"click",
function () {
updateFilterCount();
}
);
答案1
得分: -2
你的点击事件处理程序似乎在你的筛选器之前执行。我建议首先使用 setTimeout()
来延迟它,或确保你的筛选器在你的计数器之前添加了 'click' 监听器。否则,你需要确切地了解处理程序的执行顺序和它们的事件。我还建议使用 toggleClass()
,不需要在你的选择器中指定 .active
,因为你将 active
类分配给了所有 .filtered-text
或 .caps.all
元素。
英文:
Your click event handler seems goes before your filters.
I would try to postpone it with setTimeout()
first or make sure you filters add 'click' listeners before your counter.
Otherwise you need to know exact the handler's order execution and their events.
I would also use toggleClass()
and you don't need to specify .active
in your selector because you assign active
class to all elements of .filtered-text
or .caps.all
.
function updateFilterCount() {
const countFilter = $(".is-active").length;
$(".caps.count").text(countFilter);
$(".filtered-text").toggleClass('active', !!countFilter);
$(".caps.all").toggleClass("active", !countFilter);
}
updateFilterCount();
$(".fltr, .fltr-label, .filter_drawer, .button.ghost.filter__button.active").on(
"click", () => setTimeout(updateFilterCount)
);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论