首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按顺序隐藏3个元素,不使用JavaScript "transitionend“事件?

按顺序隐藏3个元素,不使用JavaScript "transitionend“事件?
EN

Stack Overflow用户
提问于 2022-04-01 16:08:31
回答 2查看 70关注 0票数 0

什么。我有3个框:blueredblack,我试图使用JavaScript事件侦听器依次转换它们:blackredblue

HOWhttps://codepen.io/gremo/pen/XWVeQVP?editors=1010

基本的HTML结构和嵌套(完整示例的pen):

代码语言:javascript
复制
<div id="container">
    <div id="blue"></div>
    <div id="red">
        <div id="black"></div>
    </div>
</div>

JavaScript代码非常简单:

代码语言:javascript
复制
const blue = document.getElementById('blue');
const red = document.getElementById('red');
const black = document.getElementById('black');

const hideElement = element => {
  console.log(`Hiding element ${element.getAttribute('id')}`);
  element.classList.add(element.dataset.hideClass);
};

black.addEventListener('transitionend', () => hideElement(red)); // when black transition ends, hide the red
red.addEventListener('transitionend', () => hideElement(blue)); // when red transition ends, hide the blue
hideElement(black); // hide the black (start the chain)

THE PROBLEM:在black结束后,bluered同时开始.这是错误的,因为blue应该在red完成后开始隐藏。此外,控制台显示blueblue事件侦听器被调用2次。

任何帮助都是非常感谢的,我从几天以来一直在努力解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-01 16:33:38

由于blackred的一个子类,因此transitionend事件出现了冒泡,导致red两次触发该事件:

代码语言:javascript
复制
document.addEventListener('DOMContentLoaded', () => {
  const blue = document.getElementById('blue');
  const red = document.getElementById('red');
  const black = document.getElementById('black');

  const hideElement = element => {
    console.log(`Hiding element ${element.getAttribute('id')}`);
    element.classList.add(element.dataset.hideClass);
  };

  black.addEventListener('transitionend', (e) => {
    e.stopPropagation();// <-- added this line
    hideElement(red);
  });
  red.addEventListener('transitionend', () => hideElement(blue));
  hideElement(black);
});

(编辑从您的代码;我不能分叉,因为我太懒注册)

票数 2
EN

Stack Overflow用户

发布于 2022-04-01 16:34:10

transitionend事件将触发一旦执行的所有侦听器。在第一个事件触发两个运行之前,红色和黑色都会注册事件侦听器。为了防止这种情况,您可以传递一个函数,该函数将在隐藏元素函数中添加事件侦听器,或者更好地将事件传递到元素旁边并调用stopPropagation。stopPropagation是一个事件函数,它将阻止事件的传播,因此只会触发第一个事件。

代码语言:javascript
复制
e?.stopPropagation()

下面是一个修改后的函数,它应该在您的上下文中工作。

代码语言:javascript
复制
document.addEventListener('DOMContentLoaded', () => {
  const blue = document.getElementById('blue');
  const red = document.getElementById('red');
  const black = document.getElementById('black');

  const hideElement = (element,e) => {
    console.log(`Hiding element ${element.getAttribute('id')}`);
    e?.stopPropagation()
    element.classList.add(element.dataset.hideClass);
  };
  black.addEventListener('transitionend', (e) => hideElement(red,e));
  red.addEventListener('transitionend', (e) => hideElement(blue,e));
  hideElement(black);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71709882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档