Gathering detailed insights and metrics for detect-it
Gathering detailed insights and metrics for detect-it
Gathering detailed insights and metrics for detect-it
Gathering detailed insights and metrics for detect-it
detect-package-manager
Detect which package manager you're using (yarn or npm)
detect-node-es
Detect Node.JS (as opposite to browser environment). ESM modification
detect-newline
Detect the dominant newline character of a string
type-detect
Improved typeof detection for node.js and the browser.
Detect if a device is mouseOnly, touchOnly, or hybrid, and if the primary input is mouse or touch.
npm install detect-it
Module System
Min. Node Version
Typescript Support
Node Version
NPM Version
419 Stars
143 Commits
13 Forks
11 Watching
2 Branches
1 Contributors
Updated on 13 Nov 2024
Minified
Minified + Gzipped
TypeScript (100%)
Cumulative downloads
Total Downloads
Last day
5.4%
41,085
Compared to previous day
Last week
4.6%
198,350
Compared to previous week
Last month
9.3%
828,390
Compared to previous month
Last year
18.7%
9,862,488
Compared to previous year
4
mouseOnly
, touchOnly
, or hybrid
mouse
or touch
mouse
, touch
, or key
inputDetect It's state is determined using multiple media query and API detections. Detect It uses the hover
and pointer
media queries, the Pointer Events API and max touch points detections, and two Touch Events API detections (browsers respond differently to each Touch Events API detection depending on the device 😩 welcome to WebDev). But now you don't have to worry about any of this, just let Detect It handle the details while you optimize your app for the type of device that's being used. 😁
Detect It has been tested on numerous real world devices (since 2016), and the tests mock multiple devices and edge cases to ensure accurate results. The detection relies on how the browser presents the capabilities of the device as it is not possible to access the device hardware directly.
CDN option ⚡️ Recommended usage ⚡️ Device responsive UX ⚡️ Setting event listeners ⚡️ Detection details
npm install --save detect-it
1import * as detectIt from 'detect-it'; 2// OR 3import { 4 deviceType, 5 primaryInput, 6 supportsPointerEvents, 7 supportsTouchEvents, 8 supportsPassiveEvents, 9} from 'detect-it';
1// types 2deviceType: 'mouseOnly' | 'touchOnly' | 'hybrid'; 3primaryInput: 'mouse' | 'touch'; 4supportsPointerEvents: boolean; 5supportsTouchEvents: boolean; 6supportsPassiveEvents: boolean;
deviceType
mouseOnly
| touchOnly
| hybrid
Indicates if the the device is mouseOnly
, touchOnly
or hybrid
. For info on how the detection works and how specific devices are classified see the Detection details section.
1import { deviceType } from 'detect-it'; 2 3if (deviceType === 'hybrid') { 4 // ensure the site is usable by both mouse and touch input 5}
primaryInput
mouse
| touch
Indicates if the primary input for the device is mouse
or touch
. For more info on how to use primaryInput
see the Recommended usage section.
1import { primaryInput } from 'detect-it'; 2 3if (primaryInput === 'touch') { 4 // tailor UX for touch input 5} else { 6 // tailor UX for mouse input 7}
supportsPointerEvents
boolean
Indicates if the browser supports the Pointer Events API. See MDN's Pointer Events and the W3C Pointer Events specification for more information on Pointer Events. See Can I use for current support.
1import { supportsPointerEvents } from 'detect-it'; 2 3if (supportsPointerEvents) { 4 element.addEventListener('pointerenter', handlePointerEnter, false); 5}
supportsTouchEvents
boolean
Indicates if the browser supports the Touch Events API. See MDN's Touch Events and the W3C Touch Events specification for more information on Touch Events.
1import { supportsTouchEvents } from 'detect-it'; 2 3if (supportsTouchEvents) { 4 element.addEventListener('touchstart', handleTouchStart, false); 5}
supportsPassiveEvents
boolean
Indicates if the browser supports passive event listeners. See this Passive Events Explainer for more information on passive events. See Can I use for current support.
1import { supportsPassiveEvents } from 'detect-it';
2
3if (supportsPassiveEvents) {
4 // passive events are supported by the browser
5 document.addEventListener('scroll', handleScroll, {
6 capture: false,
7 passive: true,
8 });
9} else {
10 // passive events are not supported by the browser
11 document.addEventListener('scroll', handleScroll, false);
12}
Optionally, instead of using npm install
you can load Detect It directly in the browser. A minified and production ready UMD version is available from the Unpkg CDN for this purpose.
1<!-- in index.html --> 2<script src="https://unpkg.com/detect-it@4/dist/detect-it.umd.production.js"></script>
1// it will be available on the window as DetectIt 2if (window.DetectIt.primaryInput === 'touch') { 3 // tailor UX for touch input 4}
TL;DR:
primaryInput
to optimize the user experience for either mouse
or touch
input (note that the app should still be usable by both inputs). Use this along with classic responsive design that adapts to screen/window size to create a fully device responsive app.supportsPointerEvents
then only set Pointer Event listeners and use pointerType
to determine if the interaction was from mouse
or touch
.Device responsive UX is about creating web apps that feel native on every device. This goes beyond classic responsive design, which only responds to the screen/window size, and includes how the user can interact with the app (the capabilities of the device). Can the user hover, swipe, long press, etc?
There are 3 parts of device responsive UX: Size (size of screen/window), Capabilities (what the user can do/capabilities of the device), and Interaction (is the user hovering, touching, etc). Size and Capabilities need to be known at render time (when the UI is rendered before the user interacts with it), and Interaction needs to be known at interaction time (when the user is interacting with the app).
(max-width: 600px)
, either applied via CSS or in JavaScript by using something like React Media.deviceType
or primaryInput
to optimize the UX for the capabilities of the device, however, in most cases I've found it makes sense to just use primaryInput
and optimize the UX for mouse
or touch
, while ensuring that the app is still usable by both inputs.primaryInput
mouse
: desktop/laptop with a normal windowprimaryInput
mouse
: desktop/laptop with a narrow windowprimaryInput
touch
: tabletprimaryInput
touch
: phonehover
, mouseActive
, touchActive
, keyActive
) and allows you to style touch interactions in a way that feels native and is not possible with CSS pseudo classes.Setting event listeners can be thought of as either setting Pointer Event listeners or setting Mouse Event and Touch Event listeners. Pointer Events can do everything that Mouse Events and Touch Events can do (and more), without having to worry about if a Mouse Event was caused by touch input and so should be ignored. It is generally preferred to use Pointer Events if they are supported.
If the browser supportsPointerEvents
then only set Pointer Event listeners and use pointerType
to determine if the interaction was from mouse
or touch
.
1import { supportsPointerEvents } from 'detect-it'; 2 3const handlePointerEnter = (e) => { 4 if (e.pointerType === 'mouse') { 5 // event from mouse input 6 } else { 7 // event from touch input 8 // note that pointerType can be 'mouse', 'touch' or 'pen' 9 // but in most situations it makes it makes sense to treat 'touch' and 'pen' as the same 10 } 11}; 12 13if (supportsPointerEvents) { 14 element.addEventListener('pointerenter', handlePointerEnter, false); 15} else { 16 // set mouse and touch event listeners 17}
If the browser doesn't support Pointer Events, then there are a couple of ways to approach setting mouse and touch event listeners.
Note that a touch interaction will fire Touch Events as the interaction is in progress (touch on the screen), and will fire Mouse Events during a long press (extended touch on the screen), or after the touch interaction has finished (after the touch is removed from the screen) to support sites that only listen for Mouse Events.
Option 1: If the device is mouseOnly
or touchOnly
then only set mouse or touch listeners, and if the device is hybrid
set both mouse and touch event listeners and ignore Mouse Events caused by touch input (you can use Event From for this).
Option 2: Always set both mouse and touch event listeners and use Event From to ignore Mouse Events from touch input.
I prefer option 2 as it's simpler to code and I haven't noticed any performance impact from setting extra listeners (note that setting Touch Event listeners on a browser that doesn't support Touch Events is fine, the browser will just ignore the event listeners).
1import { supportsPointerEvents } from 'detect-it'; 2import { eventFrom } from 'event-from'; 3 4const handleMouseEnter = (e) => { 5 if (eventFrom(e) !== 'mouse') return; 6 // code for handling mouse enter event from mouse input 7}; 8 9const handleTouchStart = (e) => { 10 // code for handling touch start from touch input 11}; 12 13if (supportsPointerEvents) { 14 // set pointer event listeners 15} else { 16 // Pointer Events are not supported so set both Mouse Event and Touch Event listeners 17 element.addEventListener('mouseenter', handleMouseEnter, false); 18 element.addEventListener('touchstart', handleTouchStart, false); 19}
deviceType
and primaryInput
To determine the deviceType
and primaryInput
Detect It uses several media query and API detections to triangulate what type of device is being used. The entire detection is done when the script is imported so the results are known at render time (Detect It doesn't set any event listeners).
Detect It uses the hover
and pointer
media queries, the Pointer Events API and max touch points detections, and two Touch Events API detections (browsers respond differently to each Touch Events API detection depending on the device). For more on this see the comments in the source code for notes about detecting the device type and edge cases.
Detect It has been tested on numerous real world devices (since 2016), and the tests mock multiple devices and edge cases to ensure accurate results. However, these detections are limited by how the browser presents the capabilities of the device (the APIs it exposes and how it responds to media queries) so there are some limitations. For example, on an iPad it is impossible to tell if a mouse is connected, so Detect It always treats iPads as a hybrid
device with primaryInput
touch
.
In the case of a legacy browser or device that doesn't support the detections (e.g. no media query or Pointer Events support), Detect It will fall back to a default mouseOnly
or touchOnly
state.
Detect It has a wide definition for what constitutes a hybrid
device, or rather a strict definition for what are mouseOnly
and touchOnly
devices, because if a device strays from only a fine point and hover with a mouse, or a coarse touch with a finger, then it should be treated uniquely when considering how the user will interact with it. Below is the source code for determining deviceType
:
1// a hybrid device is one that both hasTouch and 2// any input can hover or has a fine pointer, or the primary pointer is not coarse 3// if it's not a hybrid, then if it hasTouch it's touchOnly, otherwise it's mouseOnly 4export const deviceType = 5 hasTouch && (hasAnyHoverOrAnyFinePointer || !hasCoarsePrimaryPointer) 6 ? 'hybrid' 7 : hasTouch 8 ? 'touchOnly' 9 : 'mouseOnly';
hybrid
device exampleshybrid
with primaryInput
touch
)No vulnerabilities found.
Reason
no binaries found in the repo
Reason
license file detected
Details
Reason
Found 1/25 approved changesets -- score normalized to 0
Reason
0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
security policy file not detected
Details
Reason
project is not fuzzed
Details
Reason
branch protection not enabled on development/release branches
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Reason
116 existing vulnerabilities detected
Details
Score
Last Scanned on 2024-11-18
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More