5 回答
TA贡献1155条经验 获得超0个赞
您遇到的直接问题是,这只是查询,然后向一个元素添加事件侦听器。
const smallBox = document.querySelector('.smallBox');
smallBox.addEventListener('mouseover', () => {
smallBox.classList.add('permahover');
});
在上面的代码部分中,querySelector仅返回第一个匹配元素。您可能正在此处查找querySelectorAll ,它返回匹配元素的NodeList。
您有两个选择(如果您想进一步重组代码,也许还有其他选择)。事实上,最简单的方法是查询所有单元格并向每个单元格添加事件侦听器。
var n=16; //take grid column value as you want
const bigContainer = document.querySelector('.bigContainer')
for(var i = 1; i < n; i++) {
bigContainer.innerHTML+='<div class="row">';
for(j = 0; j < n; j++) {
bigContainer.innerHTML+='<div class="smallBox">';
}
}
const smallBoxes = document.querySelectorAll('.smallBox');
[...smallBoxes].forEach(smallBox => {
smallBox.addEventListener('mouseover', () => {
smallBox.classList.add('permahover');
});
})
.smallBox {
border: 1px solid black;
width: 20px;
height: 20px;
display: inline-block;
}
.permahover {
background: red;
}
h1 {
text-align: center;
}
.bigContainer {
text-align: center;
}
<h1>Etch-a-Sketch Assignment - The Odin Project</h1>
<div class="bigContainer">
</div>
另一种选择是使用您确定的事件委托。以下是您可以如何利用它。注意:对于像“鼠标悬停”这样的攻击性事件,这种方法有点棘手,因为您可能会得到误报目标(例如外部容器)。
var n=16; //take grid column value as you want
const bigContainer = document.querySelector('.bigContainer')
for(var i = 1; i < n; i++) {
bigContainer.innerHTML+='<div class="row">';
for(j = 0; j < n; j++) {
bigContainer.innerHTML+='<div class="smallBox">';
}
}
bigContainer.addEventListener('mouseover', e => {
var target = e.target
if (target !== bigContainer) {
target.classList.add('permahover')
}
})
.smallBox {
border: 1px solid black;
width: 20px;
height: 20px;
display: inline-block;
}
.permahover {
background: red;
}
h1 {
text-align: center;
}
.bigContainer {
text-align: center;
}
<h1>Etch-a-Sketch Assignment - The Odin Project</h1>
<div class="bigContainer">
</div>
TA贡献1875条经验 获得超3个赞
您需要使用委托事件,因为加载页面时页面上并不存在所有小框(您可以在检查器元素中找出只有第一个框具有事件侦听器)。
所以你监听整个容器(因为它总是在加载时的页面上)
bigContainer.addEventListener('mouseover', () => {
// Code for checking if we hovered a small div & if yes applying the style
});
...然后与event.target(这将是悬停的小div)进行比较
if (event.target.matches('.smallBox')) {
event.target.classList.add('permahover');
}
var n=16; //take grid column value as you want
const bigContainer = document.querySelector('.bigContainer')
for(var i = 1; i < n; i++) {
bigContainer.innerHTML+='<div class="row">';
for(j = 0; j < n; j++) {
bigContainer.innerHTML+='<div class="smallBox">';
}
}
const smallBox = document.querySelector('.smallBox');
bigContainer.addEventListener('mouseover', () => {
if (event.target.matches('.smallBox')) {
event.target.classList.add('permahover');
}
});
.smallBox {
border: 1px solid black;
width: 20px;
height: 20px;
display: inline-block;
}
.permahover {
background: red;
}
h1 {
text-align: center;
}
.bigContainer {
text-align: center;
}
<h1>Etch-a-Sketch Assignment - The Odin Project</h1>
<div class="bigContainer">
</div>
TA贡献1851条经验 获得超5个赞
您应该将事件侦听器设置为您的 DOM,并询问触发元素是否是属于该特定类的元素之一。因此您可以使用该类处理每个元素。
var n = 16; //take grid column value as you want
const bigContainer = document.querySelector('.bigContainer')
for (var i = 1; i < n; i++) {
bigContainer.innerHTML += '<div class="row">';
for (j = 0; j < n; j++) {
bigContainer.innerHTML += '<div class="smallBox">';
}
}
document.addEventListener('mouseover', function(e) {
if (e.target && e.target.className == 'smallBox') {
var target = e.target;
target.classList.add('permahover');
}
});
工作js小提琴:https://jsfiddle.net/nwukf205/
希望我能帮助你:)如果你有问题就问
TA贡献1887条经验 获得超5个赞
您可以使用forEach方法循环遍历所有框并在每个框上添加事件监听器。如果他们都有.smallBox课程,你可以这样做:
const smallBoxes = document.querySelectorAll('.smallBox');
smallBoxes.forEach(box => box.addEventListener('mouseover', () => {
smallBox.classList.add('permahover');
}))
我希望它对你有帮助!
TA贡献2012条经验 获得超12个赞
let smallBoxes = document.querySelectorAll('.smallBox');
[...smallBoxes].forEach(el => {
el.addEventListener('mouseover', e => e.target.classList.add('permahover'));
});
- 5 回答
- 0 关注
- 144 浏览
添加回答
举报