¿Hay alguna manera de detectar si un botón del mouse está actualmente desactivado en JavaScript?
Sé sobre el evento "mousedown", pero eso no es lo que necesito. Algún tiempo DESPUÉS de presionar el botón del mouse, quiero poder detectar si todavía está presionado.
es posible?
Respuestas:
Con respecto a la solución de Pax: no funciona si el usuario hace clic en más de un botón de manera intencional o accidental. No me preguntes cómo sé :-(.
El código correcto debería ser así:
Con la prueba como esta:
Si desea saber qué botón se presiona, prepárese para hacer que mouseDown sea una matriz de contadores y contarlos por separado para botones separados:
Ahora puede verificar qué botones se presionaron exactamente:
Ahora tenga en cuenta que el código anterior funcionaría solo para navegadores compatibles con el estándar que le pasen un número de botón a partir de 0. IE usa una máscara de bits de los botones presionados actualmente:
¡Ajuste su código en consecuencia! Lo dejo como ejercicio.
Y recuerde: IE usa un objeto de evento global llamado ... "evento".
Por cierto, IE tiene una función útil en su caso: cuando otros navegadores envían "botón" solo para eventos de botón del mouse (onclick, onmousedown y onmouseup), IE también lo envía con onmousemove. Entonces puede comenzar a escuchar onmousemove cuando necesite conocer el estado del botón y verificar el botón evt. Tan pronto como lo tenga, ahora ya sabe qué botones del mouse se presionaron:
Por supuesto, no obtienes nada si se hace la muerta y no se mueve.
Enlaces relevantes:
Actualización n. ° 1 : No sé por qué transfirí el documento. Será mejor adjuntar controladores de eventos directamente al documento.
fuente
event.buttons
al desencadenador de eventos que esté utilizando, sin variables externas guardadas. Hice una nueva pregunta (porque mi evento de mouseup no siempre se dispara, por lo que esta solución no funciona para mí) y obtuve esa respuesta en unos 5 minutos como máximo.Esta es una vieja pregunta, y las respuestas aquí parecen recomendar principalmente el uso
mousedown
ymouseup
realizar un seguimiento de si se presiona un botón. Pero como otros han señalado,mouseup
solo se disparará cuando se realice dentro del navegador, lo que puede conducir a perder la noción del estado del botón.Sin embargo, MouseEvent (ahora) indica qué botones se presionan actualmente:
MouseEvent.buttons
MouseEvent.which
(buttons
no estará definido para Safari) Nota:which
usa números diferentesbuttons
para los clics derecho y medio.Cuando se registre
document
,mousemove
se disparará inmediatamente tan pronto como el cursor vuelva a ingresar al navegador, por lo que si el usuario libera afuera, el estado se actualizará tan pronto como vuelva a colocar el mouse dentro.Una implementación simple podría verse así:
Si se requieren escenarios más complicados (botones diferentes / botones múltiples / teclas de control), consulte los documentos de MouseEvent. Cuando / si Safari levanta su juego, esto debería ser más fácil.
fuente
e.buttons
será1+2=3
, entoncese.buttons === 1
será falso). Si desea verificar si el botón primario está presionado, pero no le importa ningún otro estado de botón, haga esto:(e.buttons & 1) === 1
MouseEvent.buttons
, parece que eso7
significa que piensa que los botones Primario, Secundario y Auxiliar se están presionando juntos. No estoy seguro de por qué este sería el caso: ¿está utilizando un mouse avanzado? Si es así, quizás valga la pena intentarlo con uno básico. Si solo necesita ponerlo en marcha, puede usar una comprobación bit a bit para asegurarse de que se presiona el botón izquierdo e ignorar cualquier otro. p.ej.MouseEvent.buttons & 1 === 1
.Creo que el mejor enfoque para esto es mantener su propio registro del estado del botón del mouse, de la siguiente manera:
y luego, más adelante en tu código:
fuente
La solución no es buena. uno podría "pasar el mouse" sobre el documento, luego "pasar el mouse" fuera del navegador, y en este caso el navegador aún estaría pensando que el mouse está abajo.
La única buena solución es usar el objeto IE.event.
fuente
Sé que esta es una publicación antigua, pero pensé que el seguimiento del botón del mouse usando el mouse arriba / abajo se sentía un poco torpe, así que encontré una alternativa que puede ser atractiva para algunos.
El selector activo maneja el clic del mouse mucho mejor que el mouse arriba / abajo, solo necesita una forma de leer ese estado en el evento onmousemove. Para eso necesitaba hacer trampa y confiar en el hecho de que el cursor predeterminado es "automático" y simplemente lo cambio a "predeterminado", que es lo que selecciona automáticamente por defecto.
Puede usar cualquier cosa en el objeto que devuelve getComputedStyle que puede usar como bandera sin alterar el aspecto de su página, por ejemplo, el color del borde.
Me hubiera gustado establecer mi propio estilo definido por el usuario en la sección: active, pero no pude lograr que funcione. Sería mejor si es posible.
fuente
El siguiente fragmento intentará ejecutar la función "doStuff" 2 segundos después de que ocurra el evento mouseDown en document.body. Si el usuario levanta el botón, se producirá el evento mouseUp y cancelará la ejecución retrasada.
Aconsejaría usar algún método para la conexión de eventos entre navegadores: se configuró explícitamente las propiedades de mousedown y mouseup para simplificar el ejemplo.
fuente
Corto y dulce
No estoy seguro de por qué ninguna de las respuestas anteriores funcionó para mí, pero se me ocurrió esta solución durante un momento eureka. No solo funciona, sino que también es muy elegante:
Añadir a la etiqueta del cuerpo:
Luego pruebe y ejecute
myfunction()
sidown
es igual a1
:fuente
Puede combinar @Pax y mis respuestas para obtener también la duración de la inactividad del mouse:
Entonces despúes:
fuente
Debe manejar MouseDown y MouseUp y establecer alguna bandera o algo para rastrearlo "más adelante" ... :(
fuente
Si está trabajando dentro de una página compleja con controladores de eventos de mouse existentes, le recomiendo manejar el evento en la captura (en lugar de la burbuja). Para hacer esto, simplemente configure el tercer parámetro de
addEventListener
totrue
.Además, es posible que desee verificar para
event.which
asegurarse de que maneja la interacción real del usuario y no los eventos del mouse, por ejemploelem.dispatchEvent(new Event('mousedown'))
.Agregue el controlador al documento (o ventana) en lugar de document.body es importante porque garantiza que los eventos de mouse fuera de la ventana aún se graben .
fuente
Usando la API MouseEvent , para verificar el botón presionado, si lo hay:
Vuelta :
fuente
Usando jQuery, la siguiente solución maneja incluso el "arrastre de la página y luego suelte el caso".
No sé cómo maneja múltiples botones del mouse. Si hubiera una manera de iniciar el clic fuera de la ventana, luego acerque el mouse a la ventana, entonces esto probablemente tampoco funcionaría correctamente allí.
fuente
Debajo del ejemplo de jQuery, cuando el mouse está sobre $ ('elemento'), el color cambia dependiendo del botón del mouse que se presione.
fuente
Como dijo @Jack, cuando
mouseup
sucede fuera de la ventana del navegador, no nos damos cuenta ...Este código (casi) funcionó para mí:
Desafortunadamente, no obtendré el
mouseup
evento en uno de esos casos:fuente
Bueno, no puedes comprobar si está inactivo después del evento, pero puedes comprobar si está activo ... Si está activo ... significa que ya no está inactivo: jajaja
Entonces, el usuario presiona el botón hacia abajo (evento onMouseDown) ... y después de eso, verifica si está activo (onMouseUp). Si bien no está activo, puedes hacer lo que necesites.
fuente
Esta versión de navegador cruzado funciona bien para mí.
fuente