¿Es posible obtener la posición del mouse con JavaScript después de cargar la página sin ningún evento de movimiento del mouse (sin mover el mouse)?
javascript
mouseevent
dom-events
Norbert Tamas
fuente
fuente
mousemove
eventos.Respuestas:
Respuesta real: No, no es posible.
OK, acabo de pensar en una manera. Superponga su página con un div que cubra todo el documento. Dentro de eso, cree (digamos) 2.000 x 2.000
<a>
elementos (para que la:hover
pseudo-clase funcione en IE 6, vea), cada uno de 1 píxel de tamaño. Cree una:hover
regla CSS para aquellos<a>
elementos que cambian una propiedad (digamosfont-family
). En su controlador de carga, recorra cada uno de los 4 millones de<a>
elementos, verificandocurrentStyle
/getComputedStyle()
hasta encontrar el que tiene la fuente de desplazamiento. Extrapolar hacia atrás desde este elemento para obtener las coordenadas dentro del documento.NB NO HAGAS ESTO .
fuente
<a>
elementos que cubren los rectángulos dados (<img>
supongo que usando la posición absoluta de los elementos de tamaño ), reduciendo los rectángulos cada vez. Sí, es ridículo, pero no es posible obtener esta información antes del primer movimiento del mouse.Editar 2020: esto ya no funciona. Parece que los proveedores de navegadores lo resolvieron. Debido a que la mayoría de los navegadores dependen del cromo, podría estar en su núcleo.
Respuesta anterior: también puede conectar mouseenter (este evento se activa después de volver a cargar la página, cuando el mousecursor está dentro de la página). Extender el código de Corrupted debería hacer el truco:
También puede establecer x e y como nulo en mouseleave-event. Para que pueda verificar si el usuario está en su página con su cursor.
fuente
mouseleave
evento que establecex
yy
vuelve anull
o'undefined'
Lo que puede hacer es crear variables para las coordenadas
x
yy
de su cursor, actualizarlas cada vez que se mueve el mouse y llamar a una función en un intervalo para hacer lo que necesita con la posición almacenada.La desventaja de esto, por supuesto, es que se requiere al menos un movimiento inicial del mouse para que funcione. Mientras el cursor actualice su posición al menos una vez, podremos encontrar su posición independientemente de si se mueve de nuevo.
El código anterior se actualiza una vez por segundo con un mensaje de dónde está el cursor. Espero que esto ayude.
fuente
cursorX/Y
variables antes de que ocurra cualquier evento.Podría intentar algo similar a lo que sugirió Tim Down, pero en lugar de tener elementos para cada píxel en la pantalla, cree solo 2-4 elementos (cuadros) y cambie su ubicación, ancho y altura dinámicamente para dividir las ubicaciones posibles en la pantalla por 2-4 recursivamente, encontrando así la ubicación real del mouse rápidamente.
Por ejemplo, los primeros elementos toman la mitad derecha e izquierda de la pantalla, luego la mitad superior e inferior. Por ahora ya sabemos en qué cuarto de la pantalla se encuentra el mouse, podemos repetir: descubra qué cuarto de este espacio ...
fuente
La respuesta de @Tim Down no es eficaz si representa 2.000 x 2.000
<a>
elementos:Pero no tiene que representar 4 millones de elementos a la vez, en su lugar use la búsqueda binaria. Solo use 4
<a>
elementos en su lugar:<a>
elementos rectangularesgetComputedStyle()
función, determine en qué rectángulo se desplaza el mouseDe esta manera, deberá repetir estos pasos un máximo de 11 veces, teniendo en cuenta que su pantalla no es más ancha que 2048px.
Entonces generarás un máximo de 11 x 4 = 44
<a>
elementos.Si no necesita determinar la posición del mouse exactamente en un píxel, pero digamos que la precisión de 10px está bien. Debería repetir los pasos como máximo 8 veces, por lo que necesitaría dibujar un máximo de 8 x 4 = 32
<a>
elementos.Tampoco se genera y luego se destruyen los
<a>
elementos, ya que DOM es generalmente lento. En su lugar, sólo puede volver a utilizar los 4 primeros<a>
elementos y simplemente ajustar sutop
,left
,width
yheight
como se bucle a través de los pasos.Ahora, crear 4 también
<a>
es una exageración. En cambio, puede reutilizar el mismo<a>
elemento para cuando realice la pruebagetComputedStyle()
en cada rectángulo. Así, en lugar de dividir el área de búsqueda en 2 x 2<a>
elementos que acabamos de volver a utilizar un solo<a>
elemento moviéndolo contop
yleft
propiedades de estilo.Por lo tanto, todo lo que necesita es que un solo
<a>
elemento cambie suwidth
yheight
máximo 11 veces, y cambie sutop
yleft
máximo 44 veces y tendrá la posición exacta del mouse.fuente
La solución más simple pero no 100% precisa
Resultado:
{top: 148, left: 62.5}
el resultado depende del tamaño del elemento más cercano y se devuelve
undefined
cuando el usuario cambia la pestañafuente
undefined
independientemente. ¿Puedes explicar cómo usar esto?undefined
cuando el cursor no estuviera flotando sobre ningún elemento (o cuando el navegador perdiera el foco). Puede que necesite establecer un intervalo de tiempo si está probando desde la consola ..setTimeout
trabajó. Estaba usando jsfiddle y tienes razón, nunca llegó a un evento flotante porque redibuja el DOM cada vez que haces clic en reproducir. Recomendaría agregar esta pista para otros.Imagino que tal vez tenga una página principal con un temporizador y después de un cierto tiempo o una tarea completada, reenvíe al usuario a una nueva página. Ahora desea la posición del cursor y, como están esperando, no necesariamente tocan el mouse. Por lo tanto, siga el mouse en la página principal utilizando eventos estándar y pase el último valor a la nueva página en una variable get o post.
Puede usar el código de JHarding en su página principal para que la última posición siempre esté disponible en una variable global:
Esto no ayudará a los usuarios que naveguen a esta página por otros medios que no sean su página principal.
fuente
Implementé una búsqueda horizontal / vertical (primero haga un div lleno de enlaces de línea vertical dispuestos horizontalmente, luego haga un div lleno de enlaces de línea horizontal dispuestos verticalmente, y simplemente vea cuál tiene el estado de desplazamiento) como la idea de Tim Down anterior, y Funciona bastante rápido. Lamentablemente, no funciona en Chrome 32 en KDE.
jsfiddle.net/5XzeE/4/
fuente
No tiene que mover el mouse para obtener la ubicación del cursor. La ubicación también se informa en eventos que no sean mousemove . Aquí hay un evento de clic como ejemplo:
fuente
Refiriéndose a la respuesta de @ SuperNova , aquí hay un enfoque que usa clases ES6 que mantiene el contexto
this
correcto en su devolución de llamada:fuente
Aquí está mi solución. Exporta window.currentMouseX y window.currentMouseY propiedades que puede utilizar en cualquier lugar. Utiliza la posición de un elemento suspendido (si lo hay) inicialmente y luego escucha los movimientos del mouse para establecer los valores correctos.
Compositor CMS Fuente: https://github.com/ocproducts/composr/commit/a851c19f925be20bc16bfe016be42924989f262e#diff-b162dc9c35a97618a96748639ff41251R1202
fuente
fuente
Creo que puedo tener una solución razonable sin contar divs y píxeles ... jajaja
Simplemente use el marco de animación o el intervalo de tiempo de una función. aún necesitará un evento de mouse una vez, aunque solo sea para iniciar, pero técnicamente lo posiciona donde quiera.
Esencialmente, estamos rastreando un div dummy en todo momento sin movimiento del mouse.
Debajo está la lógica ...
fuente