--- title: wheel slug: Web/API/Element/wheel_event tags: - eventos translation_of: Web/API/Element/wheel_event ---
El evento "wheel" se dispara cuando la ruleta de un dispositivo (usualmente un ratón) gira. Este evento reemplaza al ahora obsoleto evento {{event("mousewheel")}}.
Este evento implementa las propiedades de: {{domxref("WheelEvent")}}, {{domxref("MouseEvent")}}, {{domxref("UIEvent")}} y {{domxref("Event")}}.
WheelEvent
{{page("/en-US/docs/Web/API/WheelEvent", "Properties")}}
MouseEvent
{{page("/en-US/docs/Web/API/MouseEvent", "Properties")}}
UIEvent
{{page("/en-US/docs/Web/API/UIEvent", "Properties")}}
Event
{{page("/en-US/docs/Web/API/Event", "Properties")}}
Este evento implementa los métodos de: {{domxref("WheelEvent")}}, {{domxref("MouseEvent")}}, {{domxref("UIEvent")}} y {{domxref("Event")}}.
WheelEvent
{{page("/en-US/docs/Web/API/WheelEvent", "Methods")}}
MouseEvent
{{page("/en-US/docs/Web/API/MouseEvent", "Methods")}}
UIEvent
{{page("/en-US/docs/Web/API/UIEvent", "Methods")}}
Event
{{page("/en-US/docs/Web/API/Event", "Methods")}}
Especificación | Estado | Comentario |
---|---|---|
{{SpecName('DOM3 Events','DOM3-Events.html#event-type-wheel','wheel')}} | {{Spec2('DOM3 Events')}} | Definición inicial. |
{{CompatibilityTable}}
Característica | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Soporte básico | 31 | {{CompatVersionUnknown}} | {{CompatGeckoDesktop("17.0")}} | {{CompatIE("9.0")}}[1] | 18 | 7.0 |
Característica | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Soporte básico | {{CompatUnknown}} | {{CompatGeckoMobile("17.0")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
[1] Internet Explorer solo toma el evento "wheel" mediante addEventListener
, no se permite el atributo onwheel
en objetos del DOM. Bug report.
En el siguiente script se crea el método multi-navegador addWheelListener
que permite escuchar el evento wheel en diferentes navegadores a la vez que se previene el funcionamiento por defecto.
// crea el metodo "addWheelListener" global // ejemplo: addWheelListener( elem, function( e ) { console.log( e.deltaY ); e.preventDefault(); } ); (function(window,document) { var prefix = "", _addEventListener, support; // detecta el tipo de evento permitido por el navegador if ( window.addEventListener ) { _addEventListener = "addEventListener"; } else { _addEventListener = "attachEvent"; prefix = "on"; } // detecta el tipo de evento wheel manejado por el navegador support = "onwheel" in document.createElement("div") ? "wheel" : // Los navegadores modernos permiten "wheel" document.onmousewheel !== undefined ? "mousewheel" : // Webkit e IE soportan al menos "mousewheel" "DOMMouseScroll"; // Asumiremos que el resto de navegadores son Firefox antiguos window.addWheelListener = function( elem, callback, useCapture ) { _addWheelListener( elem, support, callback, useCapture ); // controlaremos MozMousePixelScroll en Firefox antiguos if( support == "DOMMouseScroll" ) { _addWheelListener( elem, "MozMousePixelScroll", callback, useCapture ); } }; function _addWheelListener( elem, eventName, callback, useCapture ) { elem[ _addEventListener ]( prefix + eventName, support == "wheel" ? callback : function( originalEvent ) { !originalEvent && ( originalEvent = window.event ); // Creamos un objeto de evento var event = { // tomamos como referencia el objeto original originalEvent: originalEvent, target: originalEvent.target || originalEvent.srcElement, type: "wheel", deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1, deltaX: 0, deltaZ: 0, preventDefault: function() { originalEvent.preventDefault ? originalEvent.preventDefault() : originalEvent.returnValue = false; } }; // calculamos deltaY (y deltaX) dependiendo del evento if ( support == "mousewheel" ) { event.deltaY = - 1/40 * originalEvent.wheelDelta; // Webkit tambien soporta wheelDeltaX originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX ); } else { event.deltaY = originalEvent.detail; } // Disparamos el callback return callback( event ); }, useCapture || false ); } })(window,document);
Si el evento wheel no ha sido implementado, los eventos DOMMouseScroll
y MozMousePixelScroll
se usarán para dar retrocompativilidad. Sus atributos se calculan dependiendo del delta del evento wheel y el padre más cercano. Si el evento wheel o alguno de los anteriores invoca {{ domxref("event.preventDefault()") }}, no ocurrirá nada.
El orden de ejecución del evento es:
Un evento DOMMouseScroll
vertical en caso de que el deltaY, en consecutivas llamadas del evento se vuelva mayor que 1.0 o menor que -1.0Un evento MozMousePixelScroll
vertical en caso de que el deltaY
del último evento wheel
no sea igual a ceroUn evento DOMMouseScroll
horizontal en caso de que el deltaX
acumule un valor mayor que 1.0 o menor que -1.0Un evento MozMousePixelScroll
horizontal en caso de que el deltaX
del último evento no sea igual que cerowheel
en el grupo de sistema (Solamente add-ons pueden gestionar este grupo de eventos)
¿Qué ocurre si preventDefault()
es llamado?
wheel (grupo por defecto de evetos) |
Se llama preventDefault() |
||||
---|---|---|---|---|---|
DOMMouseScroll (Vertical) |
No se llama | Se llama preventDefault() |
|||
MozMousePixelScroll (Vertical) |
No se llama | defaultPrevented devuelve true |
Se llama preventDefault() |
||
DOMMouseScroll (Horizontal) |
No se llama | No se ve afectado | No se ve afectado | Se llama preventDefault() |
|
MozMousePixelScroll (Horizontal) |
No se llama | No se ve afectado | No se ve afectado | defaultPrevented devuelve true |
Se llama preventDefault() |
wheel (grupo de eventos de sistema) |
defaultPrevented devuelve true |
defaultPrevented devuelve true |
defaultPrevented devuelve true |
defaultPrevented devuelve true |
defaultPrevented devuelve true |
En caso de que un Add-on necesite conocer si uno de los eventos legacy es usado por contenidos del DOM puede usar el evento wheel de #6. Lee la documentación de nsIEventListenerService
para mayor detalle acerca del grupo de eventos de sistema.
Los valores delta y las acciones por defecto de eventos predefinidos pueden ser personalizados en las preferencias de usuario (details). Por lo tanto, no se debe presuponer que alguna acción en concreto va a ocurrir tras recibir este evento.
Los valores delta no indican la cantidad de scroll actual de manera predeterminada. Si el usuario presiona alguna tecla mdificadora mientras mueve la rueda de scroll, dicha acción puede causar otra totalmente diferente a la esperada, como ir adelante o atras por el historial o hacer zoom. Además, incluso cuando la acción sea la esperada, el elemento que la recibe puede ser distinto al deseado.
El objetivo del evento wheel solo está definido por la posición del cursor en el momento que se dispara este.
En Windows, los siguientes 3 eventos nativos del DOM causan eventos wheel
.
deltaMode
puede ser DOM_DELTA_LINE
o DOM_DELTA_PAGE
. Depende de las preferencias de usuario en Windows (Para configuraciones por defecto, debería ser DOM_DELTA_LINE
).EldeltaMode
puede ser DOM_DELTA_LINE
o DOM_DELTA_PAGE
. Sin embargo, ni la configuración de velocidad de rueda de ratón de Windows ni ningún UI similar de drivers permite modificar el scroll de páginas. De modo que, normalmente este valor es DOM_DELTA_LINE
.deltaMode
es siempre DOM_DELTA_PIXEL
. Pero la mayoría de dispositivos táctiles de portatiles emulan la rueda de ratón en lugar de usar este evento. Este evento es usado típicamente en Tablet PC.En Mac, el valor de deltaMode
depende del dispositivo. Si el dispositivo permite alta resolución, el scroll se hará en pixels, de manera que el valor del deltaMode
será DOM_DELTA_PIXEL
. De todos modos, el usuario puede cambiarlo a DOM_DELTA_LINE
con la preferencia "mousewheel.enable_pixel_scrolling"
. Si el dispositivo no soporta alta resolución, es siembre DOM_DELTA_LINE
.
En otras plataformas, el valor de deltaMode
es siempre DOM_DELTA_LINE
.
Los eventos wheel
no nativos nunca causarán acción por defecto.
DOMMouseScroll
and MozMousePixelScroll
mousewheel