現在使用中のデバイスがタッチデバイスかどうかを判定するコードとして、ざっくり下記のような手法がWEB上ではよく紹介されています。
'ontouchstart' in windowでチェックnavigator.maxTouchPoints > 0でチェックnavigator.msMaxTouchPoints > 0でもチェック( 旧Edge・IE用? )matchMedia('(pointer:coarse)').matchesでチェック'orientation' in windowでチェック
これらの組み合わせ方が色々なパターンで紹介されていて、結局どれが必要なの?というのがあやふやだったのでChatGPTさんに聞いてみました。
ChatGPTさんとのやりとり
※ ざっくり概要だけ再現します。
JSでタッチデバイスかどうかを判定するコードを教えて〜。(まずは普通にきいてみた)
自分
以下のコードでチェックできます。
GPTif ('ontouchstart' in window || navigator.maxTouchPoints) { // タッチデバイスの場合の処理 }
自分
ontouchstartでのチェックと、maxTouchPointsでのチェックは両方必要なの?
はい。一部のデバイスやブラウザでは、
maxTouchPointsが未定義または null である場合があります。そのため、ontouchstartも併用することで、より信頼性の高いチェックができます。したがって、両方をチェックすることで、より幅広い範囲のタッチデバイスに対応することができます。
GPT
WEB上には
自分matchMediaを使ったチェック方法も紹介されていますが、これは不要ですか?
たしかに、
matchMediaを使用してメディアクエリをチェックすることで、タッチデバイスかどうかを判定する方法もあります。以下はそのコード例です。
if (matchMedia("(pointer: coarse)").matches) { // タッチデバイスの場合の処理 }この方法は、CSSプロパティ
pointerを使用して、デバイスのポインティングデバイスの種類を判定します。pointer: coarseは、指やタッチペンなどの粗いポインティングデバイスを持つデバイスにマッチします。ただし、この方法にはいくつかの欠点があります。一部のブラウザでは
matchMediaがサポートされていない場合があるため、ブラウザの互換性に問題が生じる可能性があります。したがって、
GPTontouchstartとmaxTouchPointsを併用した方法が、最も広くサポートされ、最も信頼性が高いと言えます。ただし、ブラウザのサポート状況や要件によっては、matchMediaを使用することも選択肢の一つとして考慮できます。
なるほど…!
自分
追加で質問です。maxTouchPointsだけでなくmsMaxTouchPointsを併用する方法も見かけたのですが、これはモダンブラウザでは不要ですか?
msMaxTouchPointsプロパティは、Microsoft Edge および Internet Explorer 11 でのみ使用されます。したがって、これらのブラウザ以外では、このチェックは不要です。現代的なブラウザでは、maxTouchPointsプロパティのみを使用すれば、タッチデバイスを検出することができます。したがって、モダンブラウザでこのチェックを行う必要はありません。ただし、古いバージョンの Microsoft Edge がインストールされた Windows デバイスで動作する Web アプリケーションをサポートする場合は、
msMaxTouchPointsプロパティを使用することが必要になるかもしれません。また、Microsoft Edge の最新バージョンでは
GPTnavigator.maxTouchPointsプロパティを使用することが推奨されており、msMaxTouchPointsプロパティは非推奨になっています。
では、モダンブラウザでは
自分msMaxTouchPointsは不要ですよね?
はい。現代的な Web アプリケーションで
GPTmsMaxTouchPointsプロパティを使用する必要はありません。ただし、過去のバージョンの Microsoft Edge をサポートする必要がある場合は、msMaxTouchPointsプロパティを使用する必要があります。
Edgeで
自分maxTouchPointsがサポートされたのはいつからですか?
Microsoft Edge 17 以降でサポートされています。これは、2018年4月にリリースされたバージョンです。したがって、2018年4月以降にリリースされた Microsoft Edge バージョンでは、
GPTmaxTouchPointsプロパティを使用することができます。
ありがとう。さらに追加で質問です。
自分'orientation' in windowでタッチデバイスかどうか判定する方法もあるようなのですが、これは現在でも有効ですか?
"orientation"を使用してタッチデバイスかどうかを判定する方法は、かつては広く使われていましたが、現在では推奨されていません。このプロパティは、デバイスの方向(縦向きまたは横向き)を返すプロパティであり、タッチデバイスかどうかを判定するために使用することが意図されていないためです。また、”orientation”プロパティは、一部のブラウザではサポートされていない場合があります。さらに、最新のモバイルデバイスでは、”orientation”プロパティが廃止され、代わりに
window.screen.orientation.typeを使用することが推奨されています。したがって、”orientation”プロパティを使用してタッチデバイスかどうかを判定することは、推奨されていません。代わりに、
GPT'ontouchstart' in windowやnavigator.maxTouchPoints、matchMedia("(pointer: coarse)").matchesを使用することをお勧めします。
結論
これらのやりとりをふまえ、msMaxTouchPointsは不要と判断し(orientationでの判定はもともと採用していない)、私は下記のコードを採用しました!
const IS_TOUCH_DEVICE =
'ontouchstart' in window ||
navigator.maxTouchPoints > 0 ||
window.matchMedia('(pointer:coarse)').matches;