jQueryの$("E F")と$("E").find("F")は等価じゃない
ちょっと前にはまったから、メモメモ。
jQueryは重複する要素のマージをそこまでまじめに行わない。まぁ、マージするということは要素サイズ回のループを行うわけで速度のためには仕方ない。そんなわけで、"E F"をパースするときはタグをマージしつつやるが、$("E").find("F")はgetElementsByTagName("E")の集合を親要素にgetElementsByTagName("F")やったやつを単純にpushするので、重複がたくさん発生する危険性がある。順々にアニメーションさせるときなどは気をつけなければならない。ただ、重複一杯の後者の方が$.dateを要素数分呼び出したりしないので、大抵速い。
- 精度
- 正:$("E F")>$("E").find("F"):誤
- 速度
- 遅:$("E F")<$("E").find("F"):速
一方、$("E>F")と$("E").find(">F")は精度は変わらない。$("E")で重複が発生しなければ、find(">F")は重複するはずがない。だが、今度はチェックよりも、"E"の個数分だけ、findを関数呼び出しするところが速度低下の要因になる。
- 精度
- 正:$("E>F")=$("E").find(">F"):正
- 速度
- 速:$("E>F")>$("E").find(">F"):遅
ある程度きびきびとした動作を要求する場合、メソッドチェーンの構成も注意した方がいいと思った。