【问题标题】:JavaScript mouseover and mouseleave eventJavaScript mouseover 和 mouseleave 事件
【发布时间】:2018-07-19 04:56:26
【问题描述】:

我在相同的元素上有一个mouseovermouseleave 事件监听器,当您mouseover 它添加一个类而mouseleave 删除该类。

我正在运行forEach,因此当您mouseover 特定项目时,它会显示该项目的特定文本块。这就是我使用 JS 而不是纯 CSS 的原因。

我正在寻找优化以下代码的方法。

const pageNavRings = document.querySelectorAll('.page-nav-ring')

pageNavRings.forEach((pageRing) => {
  pageRing.addEventListener('mouseover', (e) => {
    const pageRingParent = e.target.closest('.page-nav__list--item')
    pageRingParent.querySelector('.page-nav-label').classList.add('is-visible')
  })

  pageRing.addEventListener('mouseleave', (e) => {
    const pageRingParent = e.target.closest('.page-nav__list--item')
    pageRingParent.querySelector('.page-nav-label').classList.remove('is-visible')
  })
})

似乎这段代码可以写得更好,更DRY。非常感谢所有和任何帮助。

【问题讨论】:

  • classList 有一个 toggle 方法可能会有所帮助...
  • 更多的代码就是更少的代码。声明函数而不是在循环中创建大量类似的函数。还要检查是否可以通过使用事件委托来减少事件侦听器。

标签: javascript mouseover mouseleave


【解决方案1】:

我试图使它更紧凑和清晰。不确定您的 html,所以使用parentElement 获取标签。

    const rings = document.querySelectorAll('.page-nav-ring')

    rings.forEach((ring) => {
        const label = ring.parentElement.querySelector('.page-nav-label');
        ring.addEventListener('mouseover', () => { label.classList.add("is-visible") });
        ring.addEventListener('mouseleave', () => { label.classList.remove("is-visible") });
    });

【讨论】:

    【解决方案2】:
    const pageNavRings = document.querySelectorAll('.page-nav-ring')
    
    pageNavRings.forEach(pageRing => {
      // Move everything into `handler` function
      // to make use of scoping (you will see why later)
      pageRing.addEventListener('mouseover', handler);
    })
    
    function handler(e){
      // Cache these values using variable
      const className = 'is-visible';
      const pageRingParent = e.target.closest('.page-nav__list--item')
      const pageRingLabel = pageRingParent.querySelector('.page-nav-label');
    
      pageRingLabel.classList.add(className);
    
      // Add `mouseleave` event listener in this handler is fine
      // Because it doesn't need to listen to this event
      // before everything started anyway
      this.addEventListener('mouseleave', e => {
        // Using the values from the const above,
        // You don't have to use `e.target.closest` and `querySelector` again
        pageRingLabel.classList.remove(className);
      });
    }
    

    【讨论】:

      【解决方案3】:

      我会在不使用 JavaScript 而使用 CSS 的情况下解决这个问题:

      .page-nav-ring > .page-nav__list--item {
         opacity: 1;
      }
      .page-nav-ring > .page-nav__list--item:hover {
         opacity: 0.1;
      }
      <ul class="page-nav-ring">
        <li class="page-nav__list--item">Hello World</li>
        <li class="page-nav__list--item">Hello World 2</li>
        <li class="page-nav__list--item">Hello World 3</li>
      </ul>

      不再需要 JS。当然你可以把opacity属性改成你需要的属性。

      【讨论】:

      • 我正在对元素进行forEach,因此当您mouseover 时,它会显示该特定项目的特定文本块。这就是我使用JS的原因
      • 我们应该如何知道这一点?请使用相关代码更新您的问题...
      • it shows a specific block of text 还没有
      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多