【发布时间】:2020-09-22 20:49:34
【问题描述】:
我需要在 2 个按钮上挂一个“鼠标悬停”处理程序。 它应该像这样工作 - 您将鼠标悬停在一个按钮上 - 显示一个块,您可以将鼠标悬停在该块上,并且它不会消失,直到您将鼠标从按钮和块本身移开。如果我将鼠标悬停在另一个块上 - 第一个块消失并显示第二个块,并且会发生同样的事情,就像第一个按钮和块一样。
结果是必需的,当您将鼠标悬停在菜单 https://www.zoo-bio.co.uk/ 上时,就像在此站点上一样
很遗憾,我在网上没有找到这样的东西,没有人问,所以我写在这里。
这是我的代码:
// first button
const carBrandsFilterButton = document.querySelector('.main-header__car-brands-button');
// first hidden block
const carBrandsFilter = document.querySelector('.main-header__car-brands');
// second button
const carPartsFilterButton = document.querySelector('.main-header__car-parts-button');
// second hidden block
const carPartsFilter = document.querySelector('.main-header__car-parts');
// variable for setting timeout
let timeout;
// function when you are over the button
function over(carFilter, carFilterButton) {
clearTimeout(timeout);
timeout = setTimeout(() => carFilter.style.display = 'block', 400);
carFilterButton.style.background = 'rgba(47, 59, 94, 0.9)';
}
// function when you are out of the button
function out(carFilter, carFilterButton) {
clearTimeout(timeout);
carFilter.style.display = 'none';
carFilterButton.style.background = 'rgba(47, 59, 94)';
}
// first listener to handle the first button and his block
document.body.addEventListener('mouseover', (e) => {
const filterField = e.target.parentNode.closest('.main-header__car-brands');
if (e.target.dataset.brands === "brands" || filterField !== null) {
over(carBrandsFilter, carBrandsFilterButton)
} else if (e.target.tagName === 'BODY' || filterField === null) {
out(carBrandsFilter, carBrandsFilterButton);
}
})
// second listener to handle the second button and his block
document.body.addEventListener('mouseover', (e) => {
const filterField = e.target.parentNode.closest('.main-header__car-parts');
if (e.target.dataset.parts === "parts" || filterField !== null) {
over(carPartsFilter, carPartsFilterButton)
} else if (e.target.tagName === 'BODY' || filterField === null) {
out(carPartsFilter, carPartsFilterButton);
}
})
但它不能正常工作,看起来这两个监听器发生冲突。
【问题讨论】:
标签: javascript mouseover