4

私の Web 開発クラスの 1 つで、NE4、NE6+、IE4、IE6+ ブラウザを検出し、各ブラウザに対応する CSS スクリプトを表示するスクリプトを作成するように依頼されました。

彼は私たちにこれらについて読むための記事をくれました。記事は このサイトに言及しています

生徒の一人がこう言いました

JavaScript の互換性を確保するための最良の選択は、何かをしたいときにブラウザーの機能をテストすることです。これの主な理由の 1 つは、今後ますます多くのブラウザーが作成されることです。

ここで私の質問は、ユーザーのブラウザー オブジェクトの検出またはナビゲーター オブジェクトの使用を検出するための最良の方法はどれですか?

4

8 に答える 8

7

どのブラウザが使用されているかを検出する標準的な方法は、提供されたユーザー エージェントをチェックすることです。

var BrowserDetect = {
    init: function () {
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
            || this.searchVersion(navigator.appVersion)
            || "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
    },
    searchString: function (data) {
        for (var i=0;i<data.length;i++) {
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
                if (dataString.indexOf(data[i].subString) != -1)
                    return data[i].identity;
            }
            else if (dataProp)
                return data[i].identity;
        }
    },
    searchVersion: function (dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index == -1) return;
        return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
    },
    dataBrowser: [
        {
            string: navigator.userAgent,
            subString: "Chrome",
            identity: "Chrome"
        },
        {   string: navigator.userAgent,
            subString: "OmniWeb",
            versionSearch: "OmniWeb/",
            identity: "OmniWeb"
        },
        {
            string: navigator.vendor,
            subString: "Apple",
            identity: "Safari",
            versionSearch: "Version"
        },
        {
            prop: window.opera,
            identity: "Opera"
        },
        {
            string: navigator.vendor,
            subString: "iCab",
            identity: "iCab"
        },
        {
            string: navigator.vendor,
            subString: "KDE",
            identity: "Konqueror"
        },
        {
            string: navigator.userAgent,
            subString: "Firefox",
            identity: "Firefox"
        },
        {
            string: navigator.vendor,
            subString: "Camino",
            identity: "Camino"
        },
        {       // for newer Netscapes (6+)
            string: navigator.userAgent,
            subString: "Netscape",
            identity: "Netscape"
        },
        {
            string: navigator.userAgent,
            subString: "MSIE",
            identity: "Explorer",
            versionSearch: "MSIE"
        },
        {
            string: navigator.userAgent,
            subString: "Gecko",
            identity: "Mozilla",
            versionSearch: "rv"
        },
        {       // for older Netscapes (4-)
            string: navigator.userAgent,
            subString: "Mozilla",
            identity: "Netscape",
            versionSearch: "Mozilla"
        }
    ],
    dataOS : [
        {
            string: navigator.platform,
            subString: "Win",
            identity: "Windows"
        },
        {
            string: navigator.platform,
            subString: "Mac",
            identity: "Mac"
        },
        {
               string: navigator.userAgent,
               subString: "iPhone",
               identity: "iPhone/iPod"
        },
        {
            string: navigator.platform,
            subString: "Linux",
            identity: "Linux"
        }
    ]

};
BrowserDetect.init();

http://www.quirksmode.org/js/detect.html

于 2009-02-26T03:12:07.720 に答える
5

私の Web 開発クラスの 1 つで、NE4、NE6+、IE4、IE6+ を検出するスクリプトを作成するように依頼されました。

あなたの Web 開発クラスはどうしようもなく、笑えるほど時代遅れです。

Netscape4 と IE4 が一般的なブラウザーだった時代には、スタイルと DHTML 機能のサポートが非常に異なっていたため、ブラウザーの種類を調べて、異なるスタイルシートとスクリプトを提供することがしばしば必要でした。

最近では、心配しなければならない最低品質のベースライン ブラウザーは、確実に IE6 です。IE6はXPに付属しており、アップグレードされていないWin2KおよびWin9Xボックスの使用はほとんどないため、それより低いものを使用している人はほとんどいません. 確かに、IE4 やひどい Netscape 4 を使っている人は世界に 1 人もいません。現在、これらの Web サイトで動作する Web サイトはほとんどありません。

Web 標準のおかげで、ターゲットにする可能性のある他のすべてのブラウザー (IE7+、Firefox2+、Opera、Safari、Chrome、Konqueror) は、通常、相互互換性に十分近いため、多くのブラウザー検出を行う必要はほとんどありません。IE6 には多少の注意が必要ですが、通常、標準モードを使用する場合、完全に異なるコンテンツを提供する必要はなく、いくつかの CSS ハック (具体的には「* html」) とスクリプトでの機能スニッフィングでうまくいくことができます。

ここで私の質問は、ユーザーのブラウザー オブジェクトの検出またはナビゲーター オブジェクトの使用を検出する最良の方法はどれですか?

オブジェクト/メソッドの検出。

ナビゲーター オブジェクトはできるだけ避けてください。多くの場合、互換性のために嘘をつき、文字列をスキャンしてブラウザー名を見つけようとすると、ユーザー エージェント文字列内の予期しないトークンで簡単につまずく可能性があります。

特に IE6 を検出する必要があり (これは検出して回避策を追加する必要がある最も一般的なブラウザーです)、機能スニッフィングの適切な方法がない場合は、navigator.userAgent 処理よりも条件付きコンパイルを使用することをお勧めします。

于 2009-02-26T11:02:27.043 に答える
4

最善の方法は、ブラウザに依存するコードをできるだけ使用しないことですが、絶対に必要な場合は、あなたや私よりも多くのことを知っている人によって書かれた正しいことが証明されているコードを使用してください。JQuery をお勧めします。選択肢はありますが、他にもたくさんあります (YUI や Scriptilicious などが人気です)。Google JQuery を開始します。また、'John Resig at Google' をグーグルで検索して、ブラウザの機能を検出するために彼が使用するいくつかの手法について彼が行った講演を見つけられるかどうかを確認してください。ブラウザーが従来の問題を修正するのに合わせて適応するため、非常に賢いです。

于 2009-02-26T03:10:14.683 に答える
2

1.3.2 で非推奨となったjQuery.browser()は有用な情報を返します ... jQuery.support()も参照してください

于 2009-02-26T03:12:40.077 に答える
1

特定の CSS を記述する単純な Firefox Mac User Agent Detect を作成しました。 http://www.combsconsulting.com/code-firefox-mac-hack.html

于 2009-09-03T03:24:11.897 に答える
1

最善の方法は、それを検出するのではなく、jQuery のようなブラウザー間で互換性のあるライブラリを使用することです。これには、表現力の点で他にも多くの利点があります。

于 2009-02-26T03:11:09.690 に答える
1

正直なところ、ブラウザを検出しようとしている場合は、間違った問題に取り組んでいます。私のアドバイスは、使用したい機能を検出し、それに基づいて機能を低下させることです。たとえば、XMLHttpRequest を作成する必要がある場合は、次のようなものが機能します。

  var xhr = null;
   if (typeof(XMLHttpRequest) !== 'undefined')
      xhr = new XMLHttpRequest(...);
   else if (typeof(ActiveXObject) !== 'undefined')
      xhr = new ActiveXObject('Microsoft.XMLHTTP');

   if (xhr != null)
      ...do something with it
   else
      throw "No XMLHttpRequest";

このアプローチにより、ブラウザーがより多くの機能をサポートし始めるにつれて、アプリケーションを拡張できます。言うまでもなく、これらの種類のチェックは関数のどこかに抽象化して、コードに何度も同じチェックを散らかさないようにする必要があります。

ただし、JQuery、Prototype、Dojo、YUI などの Ajax ライブラリを使用できる場合は、抽象化が既に組み込まれているため、おそらく最善の策です。

于 2009-02-26T03:25:19.547 に答える