首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在javascript中不处理transitionend事件的清除间隔

在javascript中不处理transitionend事件的清除间隔
EN

Stack Overflow用户
提问于 2021-05-21 09:11:43
回答 2查看 83关注 0票数 0

因此,正如标题所述,在使用setIntervaltransitionend事件时,清除间隔有问题,我有一段代码,其中我在window.onload函数中声明了一个名为interval的变量,我希望在某些条件变为真时清除该间隔,但问题是,该间隔没有被清除,函数继续运行。下面是我的代码片段。

代码语言:javascript
复制
window.onload = () => {
    let number = 0;
    const container = document.querySelector(".container");
    container.style.opacity = 1;
    container.style.transform = "translateX(0%)";
    const colorChanger = document.querySelectorAll(".color-changer");
    const colors = ["red", "blue", "green", "yellow"];
    let interval;
    container.addEventListener("transitionend", () => {
        interval = setInterval(() => {
        colorChanger[number].style.backgroundColor = colors[number];
        number++;
        if(number === 3) {
         clearInterval(interval);
        }
       }, 500);
    });
};

这是HTML

代码语言:javascript
复制
<div class="container">
</div>
<span class="color-changer">Some</span>  
<span class="color-changer">Text</span> 
<span class="color-changer">Here</span> 
<span class="color-changer">!</span>

这是CSS

代码语言:javascript
复制
.container  {
    opacity: 0;
    transition-duration: 3s;
    transition-property: transform, opacity;
    transform:translateX(-20%);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-21 14:13:42

问题是您正在转换两个属性:opacitytransform,因此transitionend事件触发两次,

代码语言:javascript
复制
window.onload = () => {
  let number = 0;
  const container = document.querySelector(".container");
  container.style.opacity = 1;
  container.style.transform = "translateX(0%)";
  container.addEventListener("transitionend", (evt) => {
    console.log("fired for", evt.propertyName);
  }, 500);
};
代码语言:javascript
复制
.container  {
  opacity: 0;
  transition-duration: 1s;
  transition-property: transform, opacity;
  transform:translateX(-20%);
}
代码语言:javascript
复制
<div class="container">
</div>

两个间隔并行运行,interval变量只指向最后一个区间的id,因此第一个不能再停止。

为了避免这种情况,您只需设置addEventListeneraddEventListener选项,以便您的处理程序只被调用一次:

代码语言:javascript
复制
window.onload = () => {
  let number = 0;
  const container = document.querySelector(".container");
  container.style.opacity = 1;
  container.style.transform = "translateX(0%)";
  const colorChanger = document.querySelectorAll(".color-changer");
  const colors = ["red", "blue", "green", "yellow"];
  let interval;
  container.addEventListener("transitionend", () => {
      interval = setInterval(() => {
        colorChanger[number].style.backgroundColor = colors[number];
        number++;
        if (number === 3) {
          clearInterval(interval);
        }
      }, 500);
    }, {
      once: true
    } // make it fire only once
  );
};
代码语言:javascript
复制
.container {
  opacity: 0;
  transition-duration: 1s;
  transition-property: transform, opacity;
  transform: translateX(-20%);
}
代码语言:javascript
复制
<div class="container">
</div>
<span class="color-changer">Some</span>
<span class="color-changer">Text</span>
<span class="color-changer">Here</span>
<span class="color-changer">!</span>

票数 1
EN

Stack Overflow用户

发布于 2021-05-21 09:38:49

可以是"Uncaught“表示"colorChangernumber”,您必须检查:

代码语言:javascript
复制
interval = setInterval(() => {
    if(!colorChanger[number] || number > 3) {
        clearInterval(interval);
        return;
    }
    colorChanger[number].style.backgroundColor = colors[number];
    number++;
}, 500);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67633928

复制
相关文章

相似问题

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