web-dev-qa-db-ja.com

ブラウザー検出と機能検出

ちょっと悪魔の擁護者を演じます。 (機能検出ではなく)ブラウザー検出が悪い習慣としてフラットであると考えられる理由を常に疑問に思っていました。特定のブラウザの特定のバージョンをテストして、特定の機能が予測可能な方法で動作することを確認した場合、特別なケースを実行することを決定しても問題ないようです。推論は、この部分的なブラウザのバージョンは変更されないため、将来的には完全に保証される予定です。一方、DOM要素に関数Xが含まれていることを検出しても、必ずしも次のことを意味しているわけではありません。

  1. この関数は、すべてのブラウザで同じように機能します。
  2. さらに重要なことは、将来のすべてのブラウザーでも同じように機能することです。

私はjQueryソースをちらっと見ただけで、注意深く作成されたHTMLのスニペットをDOMに挿入することで機能を検出し、特定の機能をチェックしています。これは賢明で堅実な方法ですが、私の個人的なJavaScript(jQueryなし)でこのようなことをしただけでは少し重すぎると思います。また、QAリソースが実質的に無限であるという利点もあります。一方、人々がよく目にするのは、関数Xの存在を確認し、これに基づいて、関数がこの関数を持つすべてのブラウザーで特定の動作をすることを想定していることです。

機能の検出は(正しく使用されていれば)良いことではないという意味では何も言っていませんが、論理的に聞こえてもブラウザの検出が通常すぐに却下されるのはなぜでしょうか。もう一言トレンディなことかと思います。

43
Jan Zich

数年前にResigによって この投稿 以来、ブラウザの検出は広く嫌われてきたようです。ただし、Resigのコメントは、ライブラリ/フレームワークコード、つまり、他の[ドメイン固有の]アプリケーション/サイトによってconsumedになるコードに固有のものでした。

機能検出は間違いなく良い適合であると思いますfor libraries/frameworks。ただし、ドメイン固有のアプリケーションの場合、ブラウザーの検出がそれほど悪いものかどうかはわかりません。機能の検出が難しい既知のブラウザー特性を回避する場合や、機能自体の実装にバグがあるブラウザーに適しています。ブラウザの検出が適切な時期:

  • クロスブラウザーではなく、そのクライアントのブラウザーに合わせて警告/ダイアログ/ DifferentPageを表示する必要があるサイト/アプリケーション。これは、レガシーアプリケーションでは一般的です。
  • サポートされているブラウザーとバージョンに関する厳格なポリシーが設定された銀行またはプライベートサイト(ユーザーのデータを侵害する可能性のある既知のセキュリティエクスプロイトを回避するため)
  • マイクロ最適化:特定の方法で操作を実行すると、1つのブラウザーが他のブラウザーよりも途方もなく高速になることがあります。特定のブラウザ/バージョンに分岐することは、ユーザーベースによっては有利になる場合があります。
  • IE6でのpng透明度の欠如
  • 多くの表示/レンダリングの問題(読み取り:IE css support))は特定のブラウザーバージョンでのみ発生し、テストする機能が実際にはわかりません。

そうは言っても、ブラウザの検出を行う際に避けるべきいくつかの 重大な落とし穴 (おそらく私たちのほとんどがコミットしている)があります。

26
Crescent Fresh

これは良い記事です 機能検出がブラウザスニッフィングよりも多くの点で優れている方法を説明しています。

真実は、盗聴が非常に壊れやすいことです。 arbitraryuserAgent文字列に依存し、その文字列を特定の動作に実際にマッピングするため、理論的には脆弱です。時間の経過が示すように、実際には脆弱です。数十のブラウザのすべてのメジャーバージョンとマイナーバージョンをテストし、それらのバージョンのビルド番号を解析しようとすることは、まったく実用的ではありません。一方、癖のために特定の動作をテストすると、はるかに堅牢になります。たとえば、機能テストでは、ブラウザーベンダーが偶発的に相互にコピーするバグや不整合をキャッチすることがよくあります。

私自身の経験では、IE8でPrototype.jsを修正した結果、問題の90%は、最初から手探りしなければ回避できたはずです。

Prototype.jsを修正しているときに、テストが必要な機能の一部が実際にはJSライブラリ間で非常に一般的であることを発見したので、スニッフィングを取り除こうとする人のために 共通機能テスト の小さなコレクションを作成しました。

23
kangax

理想的なソリューションは、機能とブラウザ検出の両方を組み合わせることです。前者はあなたが言及した点のために落ち、後者は時々ブラウザが「物事を機能させる」ために誤った情報を公開するために落ちます。

Mozillaにはすばらしい Browser Detection Primer があり、あなたにも役立つかもしれません。

wikipedia から歴史のさまざまな時点で、Webの使用は1つのブラウザに支配されており、多くのWebサイトは、特定のブラウザでのみ機能するように設計されており、団体の標準ではありません。 W3CやIETFなど。このようなサイトには、受信したUser-Agent文字列に応じて送信される情報を変更する「ブラウザスニッフィング」コードが含まれていることがよくあります。これは、たとえ人気のないブラウザであっても、複雑なコンテンツが送信されないことを意味します。それを正しく処理できるか、極端な場合にはすべてのコンテンツを拒否しました。このため、さまざまなブラウザがこの文字列を「クローク」または「スプーフィング」して、そのような検出コードに対して自分自身を他のものとして識別します。多くの場合、ブラウザの実際のIDが含まれます文字列の後半に。」

5
Joshua