重复执行 transitionend 事件

如何解决重复执行 transitionend 事件

我想了解为什么以下代码会以指数方式复制 transitionend 的返回值。

这对我来说没有任何意义,因为它们应该具有相同的行为并且应该只执行一次。

下面评论了预期的行为。

(function() {
  var animations = {
    start: function() {
      console.log('animations has started');
      this.transition.run();
    },transition: {
      duration: 500,run: function() {
        console.log('transitions is running');
        const el = document.querySelector('.Box');
        el.classList.toggle('fadein');
        // dont duplicate as expected !!!GOOD BEHAVIOR!!!
        /*el.ontransitionend = function(){
          console.log('transitionend triggered!');
        };*/
        // duplicates at every click !!!BAD BEHAVIOR!!!
        el.addEventListener('transitionend',function() {
          console.log('transitionend triggered');
        },false);
      }
    }
  };
  const bt = document.querySelector('button');
  bt.addEventListener('click',() => {
    animations.start();
  })
})();
.Box {
  width: 100%;
  height: 100vh;
  background: green;
  opacity: 0;
  transition: opacity .5s linear;
}

.Box.fadein {
  opacity: 1;
}
<button>Start Transition</button>
<div class="Box"></div>```

这种行为太奇怪了!

解决方法

来自MDN event handler docs

要设置事件处理程序代码,您只需将其分配给适当的 onevent 属性即可。 只能为元素中的每个事件分配一个事件处理程序。如果需要,可以通过将另一个函数分配给同一属性来替换处理程序。

在元素上设置事件处理程序的最灵活方法是使用 EventTarget.addEventListener 方法。这种方法允许将多个侦听器分配给一个元素,并在需要时删除侦听器(使用 EventTarget.removeEventListener)。

这是什么意思?

使用 el.ontransitionend 总是替换“旧”事件处理程序,因为只能有一个属性处理程序。
但是对于 el.addEventListener,您总是会添加一个新的处理程序,只要您不明确删除它,旧的处理程序就会保持不变。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?