JavaScript でタッチデバイスかを検出する
MediaQueryList を使用してデバイスがタッチデバイスかポインターデバイスかを検出できます。
次の記事で紹介されていた、CSSのMediaQueryでタッチデバイスかを判定する方法の応用です。
Detect a touch device with only CSS | by Riccardo Andreatta | Medium
※ MediaQueryListについて:JavaScriptでのメディアクエリ、matchMedia()の使い方を解説 | コリス
code:js
const mediaQuery = window.matchMedia('(hover: none) and (pointer: coarse)');
mediaQuery.matches // タッチデバイスなら true
また、次のようなReact Hooksを用意すれば、タッチデバイス・ポインターデバイスをリアルタイムに検出できます。
code:ts
const useTouchDevice = () => {
const isTouchDevice, setIsTouchDevice = useState(false);
useEffect(() => {
const mediaQuery = window.matchMedia('(hover: none) and (pointer: coarse)');
setIsTouchDevice(mediaQuery.matches);
const handleMediaQueryChanged = (event: MediaQueryListEvent) => {
setIsTouchDevice(event.matches);
};
mediaQuery.addEventListener('change', handleMediaQueryChanged);
return () => {
mediaQuery.removeEventListener('change', handleMediaQueryChanged);
};
});
return { isTouchDevice };
};
タッチデバイス・ポインターデバイスが切り替わるケースなんて、DevToolsで見ているときくらいだと思いますが、知っているといつか生きるかも?しれません。
余談:
紹介した記事にも書かれていますが、次のMediaQueryでWiiのコントローラーやKinectといったセンサーを使用したポインターからの入力かを検出できるらしいです(未検証)
code:js
const mediaQuery = window.matchMedia('(hover: hover) and (pointer: coarse)');
#JavaScript
Created by tamuraryoya