此问题在此处已有答案:
addEventListener calls the function without me even asking it to(5个答案)
6小时前关门了。
我遇到了一个问题。addEventListener方法即使在没有被触发的情况下也能正常工作。如果我以内联方式编写函数,它将正常工作。但是,如果我在循环外编写函数并调用它,则addEventListener会调用它,即使我没有将鼠标悬停在某个元素上。代码如下:
<html>
<head>
<title>Ljubicasti</title>
<style>
.arrow {
width: 15px;
margin-right: 12px;
display: none;
}
.row {
display: flex;
margin: 5px 0;
padding: 10px 60px;
font-weight: 500;
font-size: 14px;
align-items: center;
cursor: pointer;
}
</style>
</head>
<body>
<div class="row">
<img class="arrow" src="https://cdn-icons-png.flaticon.com/512/2722/2722985.png">
Some text
</div>
<div class="row">
<img class="arrow" src="https://cdn-icons-png.flaticon.com/512/2722/2722985.png">
Some text
</div>
<div class="row">
<img class="arrow" src="https://cdn-icons-png.flaticon.com/512/2722/2722985.png">
Some text
</div>
<script>
let rows = document.querySelectorAll('.row');
for (let row of rows) {
let img = row.querySelector('.arrow');
img.style.display = 'none';
row.addEventListener('mouseover', inline(img, row));
}
function inline(img, row) {
img.style.display = 'inline';
row.style.padding = '10px 60px 10px 30px';
}
</script>
</body>
</html>
很简单,但还是不行。
我试过这个:
let rows = document.querySelectorAll('.row');
for (let row of rows) {
let img = row.querySelector('.arrow');
img.style.display = 'none';
row.addEventListener('mouseover', () => {
img.style.display = 'inline';
row.style.padding = '10px 60px 10px 30px';
});
}
它起作用了...我不知道为什么。先谢谢你!
1条答案
按热度按时间i86rm4rw1#
在forloop中,你传递了一个被调用的函数(在这个例子中是returns undefined)。所以基于事件监听器的逻辑,你的代码将循环并实际应用样式,甚至在你触发屏幕上的“mouseover”之前。你必须传递一个可调用的函数
a.addEventListner('someevent', callback)
在这里,如果您定义了callback或者callback是一个匿名函数,则可以调用callback。a.addEventListener('somevent', callback())
这里,callback是不可调用的,因为您在将其传递给侦听器时调用了它。添加事件监听器(“某事件”,回调函数)