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

为何jQuery fadeOut()仅触发首个元素?如何绑定多元素到Promise?

jQuery淡入淡出函数异常:多元素fadeOut不生效的解决办法

问题根源

你在第二个条件里用的$(element1, element2)写法有误——jQuery中这种语法是把第二个参数作为上下文(元素查找范围),而非同时选中两个独立元素。实际只会执行element1的fadeOut,element2被当作查找element1的范围,自然不会触发动画。

修复方案

1. 正确选中多个元素并绑定Promise

要同时对两个元素执行fadeOut,可以用以下两种写法:

  • 用add()方法合并元素集合:
    $(element1).add(element2)
      .fadeOut("slow")
      .promise()
      .done(function() {
        $(element3).fadeIn("slow");
        resolve();
      });
    
  • 直接传入DOM元素数组:
    $([element1, element2])
      .fadeOut("slow")
      .promise()
      .done(function() {
        $(element3).fadeIn("slow");
        resolve();
      });
    

两种写法都会正确选中两个元素,.promise()会等待所有元素的动画完成后,再触发done回调并resolve外层Promise。

2. 单独调用fadeOut时绑定Promise

如果坚持分开调用fadeOut,可以用$.when()合并两个动画的Promise,确保两者都完成后再执行后续逻辑:

$.when(
  $(element1).fadeOut("slow").promise(),
  $(element2).fadeOut("slow").promise()
).done(function() {
  $(element3).fadeIn("slow");
  resolve();
});

$.when()会等待所有传入的Promise完成后,才触发done回调,保证两个元素都淡出后再resolve外层Promise。

额外修正点

原代码第三个条件中,resolve()直接写在fadeOut调用后,会导致.then()里的DOM操作在动画未完成时就执行,应该把resolve()移到fadeOut的回调内:

} else {
  $(element1).fadeOut("slow", function() {
    $(element3).fadeIn("slow");
    resolve(); // 移至此处,确保动画完成后再resolve
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:01:39