You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过jQuery仅监听父元素的CSS animationend事件

只监听父元素的animationend事件解决方案

你遇到的这个问题其实是DOM事件冒泡导致的——子元素的animationend事件会顺着DOM树向上冒泡,所以父元素不仅会收到自己的动画结束事件,还会接收到子元素冒泡上来的那一个,就出现了触发两次的情况。

这里有几个靠谱的解决办法,你可以根据自己的场景选:

1. 判断事件源是否为父元素本身

在父元素的事件监听回调里,通过对比target和currentTarget来区分:

  • target是实际触发事件的元素(可能是父元素,也可能是子元素)
  • currentTarget是绑定事件监听的元素(也就是父元素本身)

代码示例:

const parent = document.querySelector('.parent-element');
parent.addEventListener('animationend', (e) => {
  // 只有当触发事件的是父元素自己时,才执行逻辑
  if (e.target === e.currentTarget) {
    console.log('父元素动画已结束');
    // 你的业务逻辑写在这里
  }
});

这种方法不需要修改子元素的代码,很适合不想动子元素事件绑定的场景。

2. 阻止子元素的事件冒泡

直接给子元素绑定animationend事件,在回调里调用stopPropagation()阻止事件向上冒泡,这样父元素就只会收到自己的动画结束事件了。

代码示例:

const child = document.querySelector('.parent-element .child-element');
child.addEventListener('animationend', (e) => {
  e.stopPropagation();
});

这个方法比较彻底,直接切断了子元素事件的传播路径。

3. 通过动画名称筛选

如果父元素和子元素的动画有不同的名称(比如父元素动画叫parent-fade,子元素叫child-slide),可以通过事件对象的animationName属性来精准判断:

CSS示例:

.parent-element {
  animation: parent-fade 2s forwards;
}
.child-element {
  animation: child-slide 2s forwards;
}

JavaScript示例:

const parent = document.querySelector('.parent-element');
parent.addEventListener('animationend', (e) => {
  if (e.animationName === 'parent-fade') {
    console.log('父元素的动画结束了');
    // 执行你的逻辑
  }
});

这种方法逻辑清晰,尤其适合多个动画共存的复杂场景。

内容的提问来源于stack exchange,提问作者user13286

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:31:05