【发布时间】:2020-09-19 03:35:05
【问题描述】:
如何将事件监听器附加到所有具有相同类名的 div 上?
在下面的示例中,我尝试将类名 scroll-x 添加到 div 以便它可以通过运行 JS 代码来获得水平滚动功能。但是 JS 代码只适用于第一个 div。
这是一支笔https://codepen.io/Code3ater/pen/wvGYKvO?editors=0010
const scrollArea = document.querySelector(".scroll-x");
let isDown = false;
let startX;
let scrollLeft;
scrollArea.addEventListener("mousedown", (e) => {
isDown = true;
scrollArea.classList.add("active");
startX = e.pageX - scrollArea.offsetLeft;
scrollLeft = scrollArea.scrollLeft;
});
scrollArea.addEventListener("mouseleave", () => {
isDown = false;
scrollArea.classList.remove("active");
});
scrollArea.addEventListener("mouseup", () => {
isDown = false;
scrollArea.classList.remove("active");
});
scrollArea.addEventListener("mousemove", (e) => {
if (!isDown) return;
e.preventDefault();
const x = e.pageX - scrollArea.offsetLeft;
const walk = (x - startX) * 3; //scroll-fast
scrollArea.scrollLeft = scrollLeft - walk;
});
【问题讨论】:
-
[...querySelectorAll('.sroll-x')].map(el => el.addEventListener('event', fn)) -
使用event delegation而不是分配多个事件 — 它更易于维护,并且适用于动态添加的元素。例如,使用event argument 的
target。见the tag info 和What is DOM Event delegation?。
标签: javascript