javascript - 如何遍历依赖于多个函数的索引?
问题描述
我正在使用两种类型的元素,.element
和.summary
. 两个类的索引是相互对应的,所以当用户在mouseover
上发生事件时.element
,应该在其对应的 中添加一个类.summary
。同样,应该在 上删除相同的类mouseout
。
换句话说,我希望.styling
该类仅适用于鼠标悬停.summary
时.element
在没有声明这么多变量的情况下,我想知道循环这些元素的最有效方法。
var abc = document.getElementsByClassName("element");
var xyz = document.getElementsByClassName("summary");
for (let i = 1; i < xyz.length; i++) {
abc[i].addEventListener("mouseover", movein(i), false);
abc[i].addEventListener("mouseout", moveout(i), false);
}
function movein(i) {
xyz[i].classList.add("styling");
}
function moveout(i) {
xyz[i].classList.remove("styling");
}
.element {
cursor: pointer;
}
.styling {
background: red;
}
<div class="element">Element 1</div>
<div class="element">Element 2</div>
<div class="element">Element 3</div>
<div class="summary">Summary 1</div>
<div class="summary">Summary 2</div>
<div class="summary">Summary 3</div>
据我所知,这些功能可以运行,但不能在mouseover
.
解决方案
您可以这样做,而不必更新您的 html。我们以编程方式设置了一个属性,因此当我们将鼠标悬停在它上面时,我们可以获得它的索引。然后我们使用该索引来查找相关的摘要。请注意,您不会通过i
事件侦听器传递 - 您可以根据下面的代码测试event.target
并获取闪亮的新属性。event.target.dataset
这里的另一个好处是我们结合了事件侦听器逻辑,您可以看到它是有意义的。这个答案利用了您现有的结构,使用更少的代码并且易于理解。
var abc = document.getElementsByClassName("element");
var xyz = document.getElementsByClassName("summary");
for (let i = 0; i < xyz.length; i++) {
abc[i].setAttribute('data-index', i)
abc[i].addEventListener("mouseover", mousemove);
abc[i].addEventListener("mouseout", mousemove);
}
function mousemove(event) {
let element = xyz[event.target.dataset.index];
if (event.type == 'mouseover') element.classList.add("styling");
else element.classList.remove("styling");
}
.element {
cursor: pointer;
}
.styling {
background: red;
}
<div class="element">Element 1</div>
<div class="element">Element 2</div>
<div class="element">Element 3</div>
<div class="summary">Summary 1</div>
<div class="summary">Summary 2</div>
<div class="summary">Summary 3</div>
推荐阅读
- c# - 重新播种 C# 随机实例
- reactjs - React 中的语法错误
- c++ - 具有类向量的类
- ios - Swift - 导入和打开自定义文件扩展名
- listview - Flutter: Animation - 如何制作动画列表?
- python - 如何在 Jupyter Notebook 中隐藏 Python 3 代码
- azure-devops - Azure DevOps 服务器作为 NuGet“代理”服务器
- asp.net-core - 将 ViewModel 发送到 API ASP.net Core 2
- javascript - 如何在javascript中的函数内使用全局变量的内容?
- node.js - 如何在 Node 中使用 app.listen 和 Socket.io?