javascript 数据目标无法与addEventListener一起工作

camsedfj  于 2022-10-30  发布在  Java
关注(0)|答案(2)|浏览(145)

bounty将在6天后过期。回答此问题可获得+50的声望奖励。ohmygodimpregnant正在寻找来自知名来源的答案

当一个过滤器类别被选择时,active 2类被添加到类别中,在按钮周围添加一个蓝色的圆圈。这个功能对菜单本身有效。但是,我在每张卡片上都有标记为“alternative”的按钮。一旦被点击,它们就会选择等价的数据目标,就好像你从顶部的类别中选择它一样,但是active 2类不会被添加到类别中。
例如,如果你向下滚动到“安全套1”卡并点击选择,你会看到只有“安全套1”卡显示,但顶部的过滤按钮仍在“全部”下。如果你使用顶部的过滤按钮选择安全套,你会看到“安全套1”是唯一一个显示出来的,安全套按钮上面会有一个蓝色的圆圈,来自active 2类,这是我希望发生的。我将感谢任何帮助或建议,谢谢!
第一个

gk7wooem

gk7wooem1#

备注

  • 如果可能的话,您希望只执行一次搜索或根本不执行搜索,这就是为什么您不应该将查询放在运行多次的函数中。
  • 使用css类而不是直接修改样式,因为浏览器可以优化绘制,并减少布局偏移/计算。
  • 要使我的JS工作,您需要添加以下css
    CSS格式
.machine__container {
  display: block;
}

.machine__container.hide {
  display: none;
}

JS

// Anonymous Function to contain variables
(() => {
    // Find all active Elements
    const filterMenu = [...document.getElementById("filter-btns").children];
    const filterItems = [...document.getElementsByClassName("machine__container")];
    const filterButtons = [...document.getElementsByClassName("machine__button")];

    // Process Click Event
    function handleAction({ currentTarget }) {
        const { target: targetId } = currentTarget.dataset;

        // Loop through menu items
        for (const menuElement of filterMenu) {
            const { target: menuId } = menuElement.dataset;
            if (targetId === menuId) menuElement.classList.add("active2");
            else menuElement.classList.remove("active2");
        }

        // Loop through data items
        for (const itemElement of filterItems) {
            const { id: menuId } = itemElement.dataset;
            if (targetId === "all" || menuId === targetId) itemElement.classList.remove("hide");
            else itemElement.classList.add("hide");
        }
    }

    // Add Event Listners to menu items
    for (const menuElement of filterMenu) {
        menuElement.addEventListener("click", handleAction);
    }

    // Add Event Listners to filter items
    for (const buttonElement of filterButtons) {
        buttonElement.addEventListener("click", handleAction);
    }
})();
whlutmcx

whlutmcx2#

无需对代码进行完整的重构,您可以向a[data-target]元素添加click侦听器,该侦听器将使用所需的样式更新相应的li[data-target]元素。
为了便于参考,下面是JS补充的内容:

const filters = document.querySelectorAll('li[data-target]')
const targets = document.querySelectorAll('a[data-target]')

for (const target of targets) {
  target.addEventListener('click', e => {
    const filterTarget = e.currentTarget.dataset.target
    const filter = document.querySelector(`li[data-target=${filterTarget}]`)

    for (const filter of filters) {
      filter.classList.remove('active2')
    }
    filter.classList.add('active2')
  })
}

第一个

相关问题