Create onUserInputChange.md
This commit is contained in:
43
snippets/onUserInputChange.md
Normal file
43
snippets/onUserInputChange.md
Normal file
@ -0,0 +1,43 @@
|
||||
### onUserInputChange
|
||||
|
||||
Will run the callback whenever the user changes their input type (either `mouse` or `touch`). This is useful
|
||||
if you want to disable certain code depending on if the user is using touch as input or a mouse (including trackpads).
|
||||
|
||||
Use two event listeners. Assume `mouse` input initially and bind a `touchstart` event listener to the document.
|
||||
On `touchstart`, the callback is run and supplied with the current input type as an argument.
|
||||
Then, add a `mousemove` event listener to listen for two consecutive `mousemove` events firing within 20ms
|
||||
using `performance.now()` (browsers recently fire them every animation frame). Run the callback and supply the new type
|
||||
`mouse` as the argument. This process needs to happen dynamically because of hybrid devices (such as a touchscreen laptop),
|
||||
where the user can switch between either input type at will.
|
||||
|
||||
```js
|
||||
const onUserInputChange = callback => {
|
||||
let type = 'mouse';
|
||||
|
||||
const mousemoveHandler = (() => {
|
||||
let lastTime = 0;
|
||||
return () => {
|
||||
const now = performance.now();
|
||||
if (now - lastTime < 20) {
|
||||
type = 'mouse';
|
||||
callback(type);
|
||||
document.removeEventListener('mousemove', mousemoveHandler);
|
||||
}
|
||||
lastTime = now;
|
||||
}
|
||||
})();
|
||||
|
||||
document.addEventListener('touchstart', () => {
|
||||
if (type === 'touch') return;
|
||||
type = 'touch';
|
||||
callback(type);
|
||||
document.addEventListener('mousemove', mousemoveHandler)
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
```js
|
||||
onUserInputChange(type => {
|
||||
console.log('The user is now using', type, 'as an input method.');
|
||||
});
|
||||
```
|
||||
Reference in New Issue
Block a user