我最近创建了一个基于3个主要按钮之间的依赖关系的Web应用程序。
该应用程序是一个资本发现者项目。总结一下,在这个应用程序中,我有一组与区域选择有关的按钮。在用户选择了一个区域之后,他将不得不按下一个按钮,该按钮从所选区域中呈现一个随机的国家/地区,以及一组4个按钮,它们是主要的选择。用户将选择一个选项,他将收到一条反馈消息,并且按钮的颜色将相应更改。该应用程序在开始时运行平稳,但是在更改了某些区域后,它开始呈现数据非常缓慢且有很多延迟。
为了创建此按钮单击顺序以获得所需的结果,我添加了3个依赖于另一个的addEventListener函数。因此,如下面的示例所示,仅当已选择上一个值时,按钮才会记录所需的值。问题在于,如果多次选择按钮1和2,则第3个按钮将以某种方式将前几次的值相加。这就是使我的应用越来越慢且无法正常使用的原因。希望对此有解决方案。
复制步骤:
1.多次单击第一个按钮
2.多次单击第二个按钮
3.在第三个按钮上仅单击一次
const buton1 = document.querySelector('#btn1')
buton1.addEventListener('click', () => {
console.log('Hello from button 1')
const buton2 = document.querySelector('#btn2')
buton2.addEventListener('click', () => {
console.log('Hello from button 2')
const buton3 = document.querySelector('#btn3')
buton3.style.background = 'white'
buton3.addEventListener('click', () => {
console.log('Hello from button 3')
})
})
})
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<button id="btn1">1St Button</button>
<button id="btn2">2nd Button</button>
<button id="btn3">3rd</button>
</body>
</html>
最佳答案
动态分配侦听器并不是控制流的最佳方法,因为您已经发现它可能会引起一些膨胀。
这是上面的一个简单示例,其中包含单个事件侦听器和一个属性,您可以将其分配给元素以确定所需的点击顺序。
let clicked = [];
document.addEventListener('click', (e)=>{
if(e.target.matches('.funButton')){
let thisOrder = parseInt(e.target.getAttribute('data-clickOrder'));
if(clicked.length === thisOrder){
clicked.push(e.target.id);
console.log('hello from ' + e.target.id);
}
}
});
<html>
<head>
<style>
</style>
</head>
<body>
<button id="b1" class="funButton" data-clickOrder="0">1St Button</button>
<button id="b2" class="funButton" data-clickOrder="1">2nd Button</button>
<button id="b3" class="funButton" data-clickOrder="2">3rd</button>
</body>
</html>
关于javascript - 链接addEventListeners将导致一段时间后性能降低,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57972297/