Feature Detection と UA Detection どちらを使うべき?


think49
Feature Detection は未知の UA に対してのみ行うべき? - by edvakf in hatena
think49
@ "Feature Detection は遅いし、既知の UA に対してまで毎回 Feature Detection する必要は無いのではないか。既知の UA へは Feature Detection の結果を再利用するだけでいいのではないか。"
think49
@ 何か混乱してきた。
これは edvakf さんが主張する "その機能を最初に使うときに1回だけやって結果をキャッシュすることにすればいい" と変わらないような…。
think49
@ 文脈を読むと "既知の UA へは UA Detection の結果を再利用するだけでいいのではないか。" が正しいのかな。
think49
@ その棲み分けもわからないわけではないけど、キャッシュすればいいのなら UA Detection でも Feature Detection でも変わらないと思う。
think49
@ 私なら Feature Detection を採用するかなあ。
UA Detection のキャッシュは条件付きコンパイルや条件付きコメントのことだろうから、パフォーマンスが良好なのは頷ける。
think49
var target = event.target || event.srcElement; // これを毎回やるのは無駄だけど、今までは使ってた
think49
@ event = toCompatibleEvent(event); // DOM 規定のイベントオブジェクトに変換する
think49
@ 毎回、変換するので効率は悪いけど、初回に変換するのは不可能なので仕方がない。
IE に Event インターフェースオブジェクトがあれば、初回に書き換えられるのだけど…。
think49
UA Detection の欠点は実装が変化することを考慮に入れてないことだと思う。
IE8 に不具合があったとして,修正プログラムを適用して挙動が変化する可能性はある。
edvakf
@ "その機能を最初に使うときに1回だけやって結果をキャッシュすることにすればいい" はクライアントサイドの話です。Modernizr のように全部の機能を最初にテストするのではなく、ページロード時に使いたい機能だけをテストして閉じたら破棄でいいということです。
edvakf
@ わかりにくかったですね。追記しておきます。
think49
@ edvakf さんの主張は「使いたい機能だけ機能テストしてキャッシュすればいい」ということで納得しました。
ただ、もう一方との違いが今ひとつ掴めなくて…。
think49
@ "既知の UA へは Feature Detection の結果を再利用するだけでいいのではないか。" /
ひょっとして、「結果」がポイントなんでしょうか。
think49
@ 例えば、IE8- は attachEvent があることがわかっている。(Feature Detection の結果がわかっている)
think49
@ 従って次のように書ける。
think49
@ /*@ @(@) attachEvent('on' + @ @*/addEventListener(/*@ @*/ 'load', handleLoad, false);
think49
@ つまり、「既知の UA はFeature Detection の結果が明らかなのだから、UA Detection でいいのではないか」ということなのでしょうか。
edvakf
@ Nicholas Zakas さんたちの主張は、Known UA には既にテストした結果を送ればいいじゃないかということです。
think49
@ 「機能テスト用のコードを書き、その結果を出力して記録する。記録した結果を元に UA Detection すればいい。」という主張ですね。理解しました。
edvakf
@ はい。そうです。
think49
@ のコードを読んで完全に理解できました。
初めから原文を読めば良かったですね…。お手数おかけしました。
@ すごく、読みにくいコードですね…
think49
@ 掲示板で覚えました。
当時は結構使っている人がいた気がしますが、今ではほとんど見られない書き方ですね。私も今は使いません。
think49
@ 当時は質問掲示板での回答でたまに見られたかな。
ショートコーダーが好みそうなコードだと思いました。
think49
@ UA Detection ですが、コンパイルしたコードを利用するので addEvent などと比較してもパフォーマンスは優れていると思います。