0

私はデバイスと機能の検出ライブラリを作成しています(実際には使用せず、実験して遊んでいるだけです)。デバイスの検出に関しては、実行する必要がありますが、問題は1つだけです(私は思います)。私のコード:

var $device = {

    mobile: {
        android: navigator.userAgent.match(/Android/i),
        blackberry: navigator.userAgent.match(/BlackBerry/i),
        iphone: navigator.userAgent.match(/iPhone/i),
        ipod: navigator.userAgent.match(/iPod/i),
        opera: navigator.userAgent.match(/Opera Mini/i),
        windows: navigator.userAgent.match(/(Windows Phone OS|Windows CE|Windows Mobile|IEMobile)/i)
    },

    tablet: {
        ipad: navigator.userAgent.match(/iPad/i),
        galaxy_tab: navigator.userAgent.match(/(GT-P1000|GT-P1000R|GT-P1000M|SGH-T849|SHW-M180S)/i),
        windows: navigator.userAgent.match(/Tablet PC/i)
    },

    desktop: {
        other: navigator.userAgent.match(/(Linux|X11)/i),
        mac: navigator.userAgent.match(/(Macintosh|Mac OS X)/i),
        windows: navigator.userAgent.match(/Windows/i)
    }

}

$device = {
    mobile: {
        any: $device.mobile.android || $device.mobile.blackberry || $device.mobile.iphone || $device.mobile.ipod || $device.mobile.opera || $device.mobile.windows
    },

    tablet: {
        any: $device.tablet.ipad || $device.tablet.galaxy_tab || $device.tablet.windows
    },

    desktop: {
        any: $device.desktop.other || $device.desktop.mac || $device.desktop.windows
    }
}

if($device.mobile.any) {
    $device = {
        type: "Mobile Phone"
    }
} else if($device.tablet.any) {
    $device = {
        type: "Tablet"
    }
} else if($device.desktop.any) {
    $device = {
        type: "Desktop"
    }
}

if($device.desktop.windows){alert("Hello")}

さて、userAgent文字列に関する限り、それらがすべて正しいとは完全には確信しておらず、まだテストしていませんが、これは私の問題ではありません。私の問題は、それがalert「こんにちは」ではなく、グーグルクロームの開発者ツールのエラーメッセージは次のとおりです:Uncaught TypeError:undefinedのプロパティ「windows」を読み取ることができません

さて、グーグルのツールでの私の経験では、これはどこかで私の構文が間違っていて、私の方法ではないことを教えてくれますが、私はそれを得ることができないようです。何か助けはありますか?(ちなみに、ユーザーエージェントのスニッフィングは良くないことはわかっているので、後で機能検出も使用してバックアップします。)

4

2 に答える 2

1

あなたは$device頻繁に再割り当てし、以前に持っていたものを吹き飛ばしています。スクリプトが最下部に$device.desktop.windows到達するまでに、その時点$deviceではtype他のプロパティがないため、存在しなくなります。

毎回デバイスを再割り当てする代わりに、それに追加します。

var $device = {
    mobile: {
        ...
    }
};

...

$device.mobile.any = $device.mobile.android || $device.mobile.blackberry || ... ;
于 2012-10-10T23:13:25.287 に答える
0

$deviceマットが言ったように、しかしまたオブジェクトを置き換える代わりに:

> if($device.mobile.any) {
>     $device = {
>         type: "Mobile Phone"
>     }

プロパティと値を追加するだけです。

if($device.mobile.any) {
    $device.type = "Mobile Phone";
    }

いずれにせよ、文字列を解決するUA文字列データベースを使用する方がよい場合があります。もちろん、それは完全に正確ではなく、新しくて珍しいブラウザではエラーが発生しやすいですが、それでうまくいくかもしれません。

于 2012-10-10T23:20:30.533 に答える