我在 JavaScript 中有以下竞争条件:
(就是AJAX成功后淡出淡入<h1>some title</h1>
,使用CSS3过渡):
AJAX success handler
add the "fading-out" CSS class
wait for "transitionend" event --
add the "not-display" CSS class
call a callback function, which does the following:
change the title by $("#some-id").html("another title");
remove "not-display"
after 20ms, remove "fading-out" (by using a setTimeout)
情况是,如果我慢慢点击 UI,那么一切正常,但如果我继续点击 UI 并让新的 AJAX 被触发,那么在大约 20 次点击后,“transitionend”永远不会被触发,有时它会发生,有时不是。
20ms 是由于 Firefox 和 IE 不知道如何在同时删除“不显示”和“淡出”的情况下对其进行动画处理。据说Chrome能够处理它。
任何新用户点击 UI 都会取消原来的 AJAX 并触发一个新的 AJAX。
是.fading-out
一个opacity: 0
并且not-display
是一个display: none
。
我怀疑是display: none
在“淡出”阶段以某种方式启动,并取消了动画,因此中止了转换,因此该transitionend
事件从未被触发,因此该项目从未重新显示,如所述对于JavaScript 或 jQuery,如何使 transitionend 事件不触发?
但我想知道这种情况或任何其他情况是否可能是一个可能的原因,以及什么可以解决。欢迎任何见解。
(我也在想,如果这个逻辑可以有一个标志,表示如果它用于淡出和淡入,那么不要display: none
一路设置,这样也不会涉及20ms的延迟)。
更新:想一想,如果在那个 20 毫秒的窗口内,AJAX 成功处理程序添加了fading-out
类,然后 20 毫秒的延迟结束并删除了fading-out
类,是否足以淡出和淡入来触发transitionend
? 或者,如果添加和删除发生在同一个事件周期中怎么办?看起来在 Chrome 中,即使是下一个周期,transitionend
也会发生:http: //jsfiddle.net/HA8s2/36/但如果在同一个周期,则transitionend
不会发生:http: //jsfiddle.net/ HA8s2/37/