JavaScriptで特定のOSやブラウザの判定を行う方法

JavaScriptを使っていて、特定の端末やOSの場合になにか処理を実行したいときがあります。
今回はそんなときに使える判定方法についてまとめておきます。
ユーザーエージェントで判定
まずはユーザーエージェントで判定する方法です。
この方法だと特定のデバイスの場合に確実に発火しますが、その代わりにPCでブラウザ幅を狭めた場合などには発火してくれません。
OS判定
ユーザーエージェントはwindow.navigator.userAgentで取得ができる利用者の情報です。
ちなみに、大文字小文字があるとややこしいのでtoLowerCase()を使ってすべて小文字にするのが一般的です。
let ua = window.navigator.userAgent.toLowerCase();
if(ua.indexof("OS判定名") !== -1){
// 特定OSの場合の処理
}OS判定をするための判定名は下記の通りです。
| OS | 入力する判定名 | 備考 |
|---|---|---|
| macOS | mac os x | 半角スペースに注意 |
| Windows | windows nt | |
| iPhone | iphone | |
| Android | android |
ブラウザ判定
OS判定と全く同じ処理で、indexOfの中身をブラウザ用の名前に変えるだけで、ブラウザ判定は可能です。
let ua = window.navigator.userAgent.toLowerCase();
if(ua.indexof("ブラウザ判定名") !== -1){
// 特定ブラウザの場合の処理
}ブラウザ判定をするための判定名は下記の通りです。
| ブラウザ | 入力する判定名 |
|---|---|
| Google Chrome | chrome |
| Firefox | firefox |
| Safari | safari |
| Edge | edge |
| Internet Explorer | ie |
| Opera | opera |
デバイスの横幅で判定
もしPCでブラウザ幅を狭めても発火してほしい場合は、デバイス幅で判定するようにします。
ちなみに、下記コード内で使っているwindow.matchMediaを使うとメディアクエリと同じように条件が指定できます。
// デバイス幅が640px以下の場合に処理する
if (window.matchMedia('(max-device-width: 640px)').matches) {
// 640px以下の処理
} else {
// 641px以上の処理
}処理によってはOSに依存するよりも、横幅がどれだけの大きさかによって処理を分けたい場合もあるので、この方法だとOS関係なく発火できます。
使い分け方法
解析系や裏側の処理など、デバイス情報と紐付いて処理をする場合はユーザーエージェントから判定しないと、PCで横幅を狭めている場合にも発火してしまいます。
それに対して、表示系など見た目に関連する処理はデバイスの横幅から判定しないと、PCで横幅を狭めた場合に処理されずに表示崩れなどの原因になってしまいます。
状況に応じて、適した方を使用するようにしましょう。

JetpackでのError during WebSocket handshakeの解決方法
SourceTreeの外部Diff / MergeツールをKaleidoscopeに設定する
Nuxt.jsでコンポーネントを作成してコードの共通化を行う|Nuxt.jsの基本
EmmetのWrap with Abbreviationで複数行のマークアップを効率的に行う
Nuxt.jsの基本と最初のセットアップ「プロジェクトの作成と起動をするまでの流れ」
CSSで1行で簡単にスムーススクロールを実装できる「scroll-behavior」プロパティ
JavaScriptのテンプレートリテラル内で条件分岐を行う方法
Nuxt.jsで「Classic mode for store/ is deprecated and will be removed in Nuxt 3.」のエラーメッセージが表示される場合の対処法
効率的なマークアップが出来るようになるEmmetでCSSを書く時の基本
Visual Studio Codeで英単語のスペルチェックをしてくれる拡張機能「Code Spell Checker」
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
操作に没頭できる!Firefox版 Arcのようなブラウザ「Zen Browser」
chezmoi(シェモア)で始めるdotfiles管理
GitHubの通知を見逃さない!通知に特化したアプリ「Gitify」
Keyboard Maestroの変数基礎
Neovimを使い始める最初の一歩として便利な「LazyVim」
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」
Keyboard Maestroの「Macro Debugger」で複雑なマクロのデバッグを行う方法
無料版でも高機能なランチャーアプリ「Raycast」の基本機能と環境設定
OnyXでターミナルを使わずにmacOSの詳細設定を行う
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法