| Component name | hover |
|---|---|
| In the visitorId | no (reported, kept out of both ids) |
| structuredId group | none |
| Hashing | plain value; a digest only when longer than 128 characters or not printable ASCII |
| Excluded under | no browser class |
| Inner timeout | 1000 ms |
| Added in | signalsVersion 11 |
| Collector revision | 1 (reported as revision with every result) |
A mouse can rest over a link without clicking; a finger cannot. Browsers tell pages whether the main pointing device can hover. WhiskerJS records hover or none.
What it reads
The CSS hover media feature through window.matchMedia(). Nothing else: no events, no pointer positions, no input is read.
How the technique works
| Order | Query | Value reported |
|---|---|---|
| 1 | (hover: hover) |
hover |
| 2 | (hover: none) |
none |
The first match is reported; no match gives unavailable with no_match.
Why it helps
Together with pointer it separates mouse-driven devices from touch-first ones, and it is a cheap consistency check against the user agent and touch_support on your server.
Stability
Stable on most devices; it changes with the primary input, like pointer. That is why it is reported but kept out of both ids for now; it can join the id once measurement shows it is stable. Added in library PR #29 (2026-10-27) at signalsVersion 11: it is outside both ids, so adding it changed no id and needed no version bump.
Browser support and what blocks it
Every current engine answers the query. In the hosted CI runs of PR #29 (headless Chromium 153, Chrome 155, Firefox with and without its privacy settings, and WebKit, on a Linux server) every browser reported the same value in every collection. No browser class excludes it.
Privacy
It says what kind of input device is in use, which the page could also learn from the user’s own clicks and taps. It needs no permission and shows no prompt. Leave it out with collect({ exclude: ['hover'] }) if you do not need it; no id changes.
How WhiskerJS handles noise and failures
| Status | ruleId | When |
|---|---|---|
ok |
one of the values above | |
unavailable |
no_api |
no matchMedia |
unavailable |
no_match |
no value matched |
blocked |
threw, security_error |
matchMedia throws |
excluded |
caller_excluded |
you excluded it |
timed_out |
timeout, aborted |
budget or abort |
Like every component it also carries durationMs (how long its collector ran, 0.1 ms) and revision (1).
Example value
"hover": { "status": "ok", "value": "hover", "hashed": false, "durationMs": 0.1, "revision": 1 }
Questions and answers
Why does a phone report none?
A finger cannot hover: it either touches the screen or not. Phones and most tablets therefore report none, desktops with a mouse report hover.
Does WhiskerJS track where the mouse hovers?
No. It asks the browser one yes-or-no question about the device's capability. No pointer events or positions are read.