現象
jQueryを1,2系から3系にバージョンアップした際、fadein()やfadeout()がうまく動かず、瞬間的に表示/非表示が切り替わる挙動を示すことがある。
原因
3系にて現在時刻の取得処理がjQuery.now()ではなく、Date.now()を利用するようになっている。
Date.now()をグローバルに上書き1してしまうような、日時操作系の古いライブラリなどが共存している環境においては干渉しアニメーションが異常な動作となる。
2系のタイマー処理
https://github.com/jquery/jquery/blob/2.2-stable/src/effects.js#L31
3系のタイマー処理
https://github.com/jquery/jquery/blob/main/src/effects.js#L42
対応策
- 問題となっている日時操作ライブラリを最新に更新する。
- 更新してもDate.now()の挙動が変わらない場合、可能であればPRを出すか、あるいはそのライブラリの使用を辞める。
- メンテがとうの昔に終わっており、代替案もすぐには用意できずどうにもこうにもならない場合は、最悪ライブラリに手を入れて自社管理することも考える。(こういうケースではだいたい自サーバーでホスティングしていると思うので…)
-
コンソールでDate.now()を実行した時に、Unixタイムスタンプではなくフォーマット済の時刻文字列を返却するように変えるライブラリが存在し、こういったものが該当する。 ↩