16

JavaScript を使用してユーザー エージェント文字列を盗聴し、ブラウザのバージョンを検出することは、非常に悪いことです。jQuery の最新バージョンでは$.browser、代わりにそのオブジェクトが非推奨になりまし$.supportた。しかし、IE のみに影響し、他のブラウザーには影響しないバグや問題があり、その理由がわからない場合はどうすればよいですか?

私の場合、いくつかのjQueryコードは、マウスオーバーとマウスアウトのアニメーションでツールチップを表示および非表示にします。Internet Explorer では、ツールチップの div が非表示になる前に非常に大きなサイズに変更され、ひどくぎくしゃくしたように見えます。また、ヒントのあるアイテムの山の上にマウスを移動すると、実際にブラウザが強制終了されます。IEが「サポート」していない特定の機能をテストする必要があるかどうかはわかりません。そのため、IEをスニッフィングして別の方法を使用する方がはるかに簡単です。代わりに何ができる/すべきですか?

4

7 に答える 7

10

ユーザー エージェントをスニッフィングするだけでは (jquery が $.browser オブジェクトを生成するために行うことです)、すべての真実を知ることはできません。

ユーザー エージェント文字列は多くのブラウザーで簡単に変更できるため、たとえば、IE を使用していると思われるすべてのユーザーから IE で機能しない機能を無効にすると、将来の一部のブラウザーまたは単に、何らかの理由で (たとえば、ブラウザーのスニッフィングに基づく制限を回避するなど)、IE を使用しているふりをします。

これはそれほど大きな問題ではないように思えるかもしれませんが、それでも悪い習慣です。

はい、私も IE スニファーです。私が使う

$.browser.msie && document.all

念のために。

于 2009-03-19T06:33:21.047 に答える
6

この最初の注意点は、ユーザーエージェントのスニッフィングは単に見ることを意味するのではなくnavigator.userAgent、ブラウザが何であると信じているかに基づいて動作を変更するために人々が使用するさまざまなメソッドを表す一般的な用語です。

したがって、問題はユーザーエージェント文字列を確認することではなく、ブラウザが何であるかを基にサイトが何をすべきかを決定することです。これは、将来、サイトを制限または破壊する可能性があることを意味します。たとえば、IEをブロックする複数のキャンバスデモを見てきました。彼らはcanvasがサポートされているかどうかを確認しておらず、明示的にIEを探しています。それを見ると、IEが壊れていると表示されます。つまり、IEが最終的にcanvasをサポートしたとしても、これらのサイトは機能しません。

ブラウザをスニッフィングするのではなく、常に関心のある機能やバグの検出を試みる必要があります。これらのテストの最も一般的な例は、「オブジェクト検出」です。document.createElement("canvas").getContextこれは、canvasの存在を検出する方法であり、現在のバージョンでサポートされていない場合でも、どのブラウザでも正しくcanvasを取得します。

于 2009-03-19T07:30:11.910 に答える
4

ブラウザー スニッフィングが機能スニッフィングより劣っているという問題と同様に、navigator.userAgent を文字列として処理すること自体が、ブラウザー スニッフィングの非常に信頼性の低い方法です。

すべてのブラウザが自分自身を識別する「名前/バージョン」方式に固執していれば、うまく機能するかもしれませんが、そうではありません。ほとんどのブラウザは、それらが何であるかに関係なく、「Mozilla/some.version」であると主張しています。そして、最初のビットは、文字列の唯一の容易に解析可能な部分です。残りは完全に標準化されていません。そのため、スクリプトは文字列全体で「MSIE」などの文字部分文字列の検索を開始しました。これは災害です。

  • 一部のブラウザーは、主に不適切な文字列スニファーを無効にするために、ユーザー エージェント文字列に "MSIE"、"Gecko"、"Safari" などの部分文字列を含めて、意図的になりすましを行います。

  • 一部のブラウザーでは、ユーザー エージェント文字列全体をユーザーの制御下でスプーフィングできます。

  • 一部のブラウザー バリアントはそうではありません。たとえば、IE Mobile は通常の IE とはまったく異なりますが、「MSIE」はそれに一致します。

  • 一部のブラウザーでは、アドオンが任意のテキストを含むユーザー エージェント文字列に追加のトークンを書き込むことができます。不正なアドオンによるレジストリの変更が 1 つあるだけで、MSIE が Firefox のように見える可能性があります。

  • 文字列の一致は、本質的に信頼できません。たとえば、「CLUMSIERbrowser」という新しいブラウザは、MSIE と一致します。

于 2009-03-19T07:16:50.240 に答える
2

ブラウザは自分が誰であるかについて嘘をつくため、お勧めしません。http://farukat.es/journal/2011/02/499-lest-we-forget-or-how-i-learned-whats-so-bad-about-browser-sniffingを参照してください( modernizr ライブラリ)。

また、本質的に将来性がありません。記事から:

ブラウザ スニッフィングは、コードの一部が将来どのように機能するかを推測する手法です。一般に、これは、特定のブラウザのバグが常に存在するという仮定を立てることを意味します。これは、ブラウザが変更を加えてバグを修正するときに、コードの破損につながることがよくあります。

機能検出は、はるかに単純で、コードの意図がより明確になり、ブラウザが誰であるかについて嘘をつくという問題を完全に回避できるため、推奨されます。

于 2013-08-14T14:36:18.033 に答える
2

間違えると、それらをサポートする将来のブラウザーの機能を誤って切断する可能性があるためです。

便利だと思うことが多いです。私はIE6 がアルファ透明度をサポートしていないことを知っているので、ブラウザ スニッフィングを使用して IE6 を検出し、それらを使用する要素を非表示/変更します

また、マウスを何度も素早く動かすには、HoverIntentを試してください。setTimeout() を使用します。マウスが要素の上に短時間置かれたときにのみイベントを発生させ、サイクルを節約し、イベントのキューイングを回避し、ブラウザーをフリーズさせる可能性があると考えています。

個人的には、ブラウザのバージョン/タイプ メソッドで jQuery を好みました。ブラウザに基づいてフレンドリーな hello メッセージを表示するために使用できます。おそらく、「ブラウザのスニッフィングは悪だ」というプレッシャーのために、jQueryはそれを非推奨にしました。

アップデート

John Resig (jQuery の作成者) は次のように述べています。

私たちは近い将来 jQuery.browser を維持しますが、開発者にはそれを使わないようにしてもらいたいと考えています。開発者にそうしてもらう最善の方法は、適切な開発パターンの良い例になることです。

明確にするために: $.support に含まれるポイントは、ほとんどがブラウザー固有のバグ (通常のオブジェクト検出ではテストできない IE のバグ) であり、考えられるすべてのバグ (約 12 程度) を網羅しているわけではありません。将来、他の開発者が独自のテスト ポイントを追加することが予想されます。

また、そのコミットでは、実際の support.js ファイルを配置するのを忘れていました - ここで見つけることができます: http://dev.jquery.com/browser/trunk/jquery/src/support.js?rev=5986

ソース: http://www.reddit.com/r/programming/comments/7l2mr/jquery_removes_all_browser_sniffing/

参照: http://dev.jquery.com/changeset/5985

于 2009-03-19T06:19:16.090 に答える
2

HTML5 ボイラープレートと jquery から学んだことを組み合わせて使用​​するため、IE の条件付きコメントを使用して IE のバージョンを判断し、これらのクラスの存在をテストします。したがって、HTML の上部には次のように表示されます。

<!--[if lt IE 7 ]> <html class="no-js ie6" lang="en"> <![endif]-->
<!--[if IE 7 ]>    <html class="no-js ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]>    <html class="no-js ie8" lang="en"> <![endif]-->
<!--[if IE 9 ]>    <html class="no-js ie9" lang="en"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!--> <html class="no-js" lang="en"> <!--<![endif]-->

次に、次のようにjqueryで.ie6、.ie7などの存在をテストします。

if($('.ie6, .ie7').length > 0){
    // your conditional stuff here
}

私にとってはうまくいきます。

注: 明らかに、これは IE のバージョンのみをテストしますが、他のほとんどのブラウザーでは、最近の IE で常に発生する問題は発生せず、ユーザー エージェントをテストするよりもはるかに安全です!

于 2012-01-19T14:26:14.010 に答える
1

ユーザーエージェントではなく、機能をスニッフィングします。擬似コード:

if (browser.supports('feature')){
    //execute feature
}

else{
    //fallback
}
于 2013-11-12T20:12:46.293 に答える