(a)ユーザーエージェントを解析し、ブラウザーのバージョンを判別し、ブラウザーのバージョンに応じてコードにスイッチを記述します。
(b)必要なフィールド/必要なメソッドの呼び出しを確認して、機能のサポートを決定しようとします。
歴史的に、2番目のオプションはより真実であると考えられており、最新のすべてのプロジェクトで実装されています。 jQueryがこのようになると言うだけで十分です。
そして、引数は正しいようです:(a)通常のデータベースを保存する必要はありません、(b)一部のブラウザに新しい機能が表示された場合、コードを変更せずに自動的に動作を開始します、(c)未知の(エキゾチックな、新しい)ブラウザ追加のジェスチャなしで機能します。(d)ユーザーエージェントがユーザーに対して変更された場合、コードは引き続き機能します。
これはすべて良いことですが、小規模なプロジェクトにのみ適しています。
このアプローチには、特定の機能が検出されたときに解決できない困難がありますが、機能しません。
理想的な世界では、機能がブラウザに実装されている場合、機能します。 実際には-それは動作するかもしれませんが、多分そうではありません。 一般に、ブラウザの新しいバージョンは突然壊れる可能性があります。
ここで、transform3dはChromeで機能し、15番目のバージョンでは壊れて壊れました。
code.google.com/p/chromium/issues/detail?id=119076&can=1&q=transform%203d&sort=-pri&colspec=ID%20Pri%20Mstone%20ReleaseBlock%20OS%20Area%20Feature%20Status%20Owner%20Summary
そして、彼らは21日にだけそれを修復しました。
機能検出は、ある条件下では、transform3dを使用したブロックが近くの入力をクリックできないことを見つけるのにどのように役立ちますか?
もちろん、transform3dによって近くの入力がクリック不可にならないように、自動テストを回避して記述できます。 やがて、コードはブラウザのバグに対する巨大な自動テストに変わります。
または、Opera 10-11では、トランジションが正しく機能するために、ページ上の要素をヤンクして手でリフローを呼び出す必要がありました。そうしないと、アニメーションアーティファクトが表示されます。 これを自動的に検出する方法は?
ブラウザに加えて、スクリプトライターの巨大な軍隊もあります。 たとえば、デフォルトのテーマJoomla! 1.5はmootools 1.12で引き続き使用されており、次のように表示されます。
Array.extend({ forEach: function (fn,bind) { for (var i=0, j=this.length; i<j; i++) fn.call(bind,this[i],i,this); } });
また、 ブラウザの実装では、次のように記述されています。
Array.prototype.forEach = function(fn, scope) { for(var i = 0, len = this.length; i < len; ++i) { fn.call(scope || this, this[i], i, this); } }
つまり 2番目のパラメーターが設定されていないブラウザー実装は、配列自体をコンテキストとして置き換えますが、mutulzovayaはそうではありません。 また、機能検出を使用する美しいライブラリは、JumlaのIEのバグのように機能します-アレイプロトタイプにはforEachがありますが、正しく機能しません。 ここで何をしますか? forEachで機能の検出に機能検証を追加するか、コンテキストの使用を停止しますか?
しかし、古き良きユーザーエージェントの解析は、これらすべてを節約します。 はい、彼は作業機能を決定する際に追加の作業を追加しますが、非機能機能を決定する際の頭痛も取り除きます。
合計すると、プロジェクトでブラウザの新機能を集中的に使用したり、積極的なユーザーコードを使用してページに埋め込んだりすると、遅かれ早かれ機能の検出が行われます。 はい、ユーザーエージェントを解析すると、非標準のブラウザーと再定義されたユーザーエージェントで視聴者の一部を奪います-しかし、これらは測定可能なリスクです。 非標準ブラウザごとに、そのシェアを見て、そのサポートが報われるかどうかを判断できます。 機能検出を使用すると、 計り知れないリスクが追加されます。悪魔は、この機能またはその機能が曲がって動作するユーザーの割合を知っています。