javascript - 如何减少 JavaScript 事件监听器的重复性?

标签 javascript arraylist addeventlistener

我在思考优化这段代码的新方法时遇到了一些困难。现在看起来太重复、太长了。我可以与 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/

相关文章:

javascript - AngularJS watch 没有被触发

javascript - 基本 JS Youtube 订阅者数量不适用于 jQuery

java - 将 ArrayList 分组为 JSON 数组/对象

javascript - 将多个事件绑定(bind)到一个监听器(没有 JQuery)?

javascript - 我是否错误地使用了文档?

javascript - 制作多列内联 block 容器以适应内容宽度

javascript - 可通过 Javascript 更改的高编号 Colspan HTML 表

java - 数组列表错误

Java Eclipse 建议我将方法设为静态

javascript - 将事件监听器添加到使用 javascript 创建的 <li>