javascript - 合并事件监听器和点击处理程序

标签 javascript

我有一个脚本可以切换两个 div 的内容显示。我目前在每个链接上使用一个事件监听器和一个单击处理程序,但需要将它们合并为一个。最后,应该有一个点击处理程序,根据点击的链接查找 id(ende),并根据该链接切换 View ,而不是根据下面实现。我对如何使用一个链接来查找任一链接的 id 并根据该链接进行切换有点困惑。

const Terms = {
  bindEvents () {
    this.enTrigger.addEventListener('click', (e) => {
      this.langToggle(this.englishContent)
      this.enTrigger.classList.add('active')
      this.frTrigger.classList.remove('active')
    })
    this.frTrigger.addEventListener('click', (e) => {
      this.langToggle(this.frenchContent)
      this.frTrigger.classList.add('active')
      this.enTrigger.classList.remove('active')
    })
  },

  init () {
    this.englishContent = document.getElementById('english-terms')
    this.frenchContent = document.getElementById('french-terms')
    this.enTrigger = document.getElementById('en')
    this.frTrigger = document.getElementById('fr')
    this.bindEvents()
  },

  langToggle (id) {
    this.englishContent.style.display = 'none'
    this.frenchContent.style.display = 'none'
    id.style.display = 'block'
  }
}

document.addEventListener('DOMContentLoaded', () => {
  Terms.init()
})
.trigger.active {color:red;}
<div class="terms-nav">
  <a class="trigger active" id="en">English</a>
  <a class="trigger" id="fr">French</a>
</div>
<div id="english-terms">English Content</div>
<div id="french-terms" style="display:none">French Content</div>

最佳答案

你说的是。您创建一个监听器并检查 id:

const Terms = {
  bindEvents () {
    var listener = (e) => {
      var id = e.target.id; // Get the id of the element that was clicked
      if (id && this.buttons.hasOwnProperty(id)) { // Check if an element was actually selected
        this.buttons[id].classList.add('active');
        for (var i in this.buttons) { // Loop through the other elements and disable them (only one but to optimize if you add more).
          if (i != id) {
              this.buttons[i].classList.remove('active');
          }
        }
        this.langToggle(id);
      }
    };
    var languages = document.getElementById("terms-nav");
    languages.addEventListener("click", listener);
  },

  init () {
    this.buttons = {
      en: document.getElementById('en'),
      fr: document.getElementById('fr')
    };
    this.terms = {
      en: document.getElementById('english-terms'),
      fr: document.getElementById('french-terms')
    };
    this.bindEvents();
  },

  langToggle (id) {
    for (var i in this.terms) {
      if (i != id) {
        this.terms[i].style.display = "none";
      }
    }
    this.terms[id].style.display = "block";
  }
}

document.addEventListener('DOMContentLoaded', () => {
  Terms.init()
})
.trigger.active {color:red;}
<div class="terms-nav" id="terms-nav">
  <a class="trigger active" id="en">English</a>
  <a class="trigger" id="fr">French</a>
</div>
<div id="english-terms">English Content</div>
<div id="french-terms" style="display:none">French Content</div>

这样,您还可以仅将监听器附加到父级(最好只有一个事件处理程序,而不是 2 个或更多),并且它将在单击子级时进行处理。

关于javascript - 合并事件监听器和点击处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49639497/

相关文章:

javascript - HTML 5 视频播放无法在 iPhone(Chrome 和 Safari)上运行

javascript - 在 javascript 对象中使用 html 对象作为属性 "name"有什么危险吗?

javascript - 如何仅使用javascript获取框索引号

javascript - 如何找到焦点React组件? (如 document.activeElement)

javascript - Chart.js 折线图中的渐变太模糊

javascript - Bootstrap .nav-pills 折叠对齐

javascript - 使用 V-For 为按钮动态分配键码

javascript - Angular 7/1.x 混合应用程序可以支持 HMR 吗?

javascript - 具有 d3.js 和高度属性的响应式 SVG

javascript - 背景图像和 javascript 显示工件