我在思考优化这段代码的新方法时遇到了一些困难。现在看起来太重复、太长了。我可以与 EventListener 分开编写函数,但这只会使代码行数增多,代码变得更长。
let modalIntro = document.getElementById('modal-intro');
let buttonIntro = document.getElementById('button-intro');
let close = document.getElementsByClassName('close')[0];
buttonIntro.addEventListener ('click', function(){
modalIntro.classList.remove("out");
modalIntro.classList.add("in");
});
close.addEventListener('click', function (){
modalIntro.classList.add("out");
});
let modalWork = document.getElementById('modal-work');
let buttonWork = document.getElementById('button-work');
let close1 = document.getElementsByClassName('close')[1];
buttonWork.addEventListener ('click', function(){
modalWork.classList.remove("out");
modalWork.classList.add("in");
});
close1.addEventListener('click', function (){
modalWork.classList.add("out");
});
let modalAbout = document.getElementById('modal-about');
let buttonAbout = document.getElementById('button-about');
let close2 = document.getElementsByClassName('close')[2];
buttonAbout.addEventListener ('click', function(){
modalAbout.classList.remove("out");
modalAbout.classList.add("in");
});
close2.addEventListener('click', function (){
modalAbout.classList.add("out");
});
let modalContact = document.getElementById('modal-contact');
let buttonContact = document.getElementById('button-contact');
let close3 = document.getElementsByClassName('close')[3];
buttonContact.addEventListener ('click', function(){
modalContact.classList.remove("out");
modalContact.classList.add("in");
});
close3.addEventListener('click', function (){
modalContact.classList.add("out");
});
任何帮助将不胜感激。
最佳答案
鉴于您有一个通用的命名模式,并假设关闭按钮是每个模式的子级,您可以执行以下操作:
注意我将modal.classList.remove('in');
添加到关闭按钮
解决方案
function bindModals(modals) {
modals.forEach(name => {
let modal = document.getElementById(`modal-${name}`)
let button = document.getElementById(`button-${name}`)
let close = modal.querySelector('.close');
button.addEventListener ('click', function(){
modal.classList.remove('out');
modal.classList.add('in');
});
close.addEventListener('click', function (){
modal.classList.remove('in');
modal.classList.add('out');
});
});
}
bindModals(['intro', 'work', 'about', 'contact'])
.out {
display: none;
}
.in {
display: block;
border: 1px solid red;
height: 200px;
width: 400px;
}
<section>
<button id="button-intro">Intro</button>
<button id="button-work">Work</button>
<button id="button-about">About</button>
<button id="button-contact">Contact</button>
</section>
<section id="modal-intro" class="out">
<button class="close">Close</button>
<p>Intro Modal</p>
</section>
<section id="modal-work" class="out">
<button class="close">Close</button>
<p>Work Modal</p>
</section>
<section id="modal-about" class="out">
<button class="close">Close</button>
<p>About Modal</p>
</section>
<section id="modal-contact" class="out">
<button class="close">Close</button>
<p>Contact Modal</p>
</section>
关于javascript - 如何减少 JavaScript 事件监听器的重复性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53778779/