React lie tous les événements à l'élément Root (et non à l'élément document
), et le wheel
est lié en interne à l'aide de true
option et je cite MDN :
Un booléen qui, s'il est vrai, indique que la fonction spécifiée par listener n'appellera jamais preventDefault(). Si un auditeur passif appelle preventDefault(), l'agent utilisateur ne fera rien d'autre que de générer un avertissement dans la console.
Voici comment j'ai bloqué le défilement de la page lorsque j'utilise la molette pour affecter un champ de saisie :
const wheelTimeout = useRef()
const onWheel = e => {
// ... some code I needed ...
// while wheel is moving, do not release the lock
clearTimeout(wheelTimeout.current)
// flag indicating to lock page scrolling (setTimeout returns a number)
wheelTimeout.current = setTimeout(() => {
wheelTimeout.current = false
}, 300)
}
// block the body from scrolling (or any other element)
useEffect(() => {
const cancelWheel = e => wheelTimeout.current && e.preventDefault()
document.body.addEventListener('wheel', cancelWheel, {passive:false})
return () => document.body.removeEventListener('wheel', cancelWheel)
}, [])
Discussions de référence :