2011-09-26 28 views
6

Estoy intentando que aparezca una rueda de selección cuando el usuario mantiene presionada la tecla Shift.Obteniendo la posición del mouse en el evento del teclado

La rueda debe estar centrada en la posición del mouse.

Sin embargo, cuando pruebo esto, pageX y clientX no están definidos en el objeto de evento.

¿Es posible obtener las coordenadas del mouse en un evento de teclado?

Respuesta

2

No, simplemente realice un seguimiento de los eventos mousemove y guarde continuamente la posición actual en caso de que reciba un evento de teclado.

+3

Gracias por proporcionar una solución que no depende de jQuery: p Detesto jQuery ... –

+0

Jeje, yo también, en secreto. :-) –

+0

Esto nuevamente asume que el usuario mueve el mouse. ¿Qué sucede cuando un usuario presiona la tecla Mayús solo? – arviman

2

posición del ratón caché en una variable global en todos los mousemove evento y utilizarlo cuando una tecla activa el evento:

var mousePosition = {x:0, y:0}; 
$(document).bind('mousemove',function(mouseMoveEvent){ 
mousePosition.x = mouseMoveEvent.pageX; 
mousePosition.y = mouseMoveEvent.pageY; 
}); 
$(document).bind('keyup', function(keyUpEvent){ 
    $('body').append($('<p/>').text('x:' + mousePosition.x + ' * y: ' + mousePosition.y)); 
}); 

JSBIN: http://jsbin.com/uxecuj/4

de JavaScript sin jQuery:

var mousePosition = {x:0, y:0}; 
document.addEventListener('mousemove', function(mouseMoveEvent){ 
    mousePosition.x = mouseMoveEvent.pageX; 
    mousePosition.y = mouseMoveEvent.pageY; 
}, false); 

document.addEventListener('keyup', function(keyUpEvent){ 
    var divLog = document.querySelector('#log'), 
     log = 'x:' + mousePosition.x + ' * y: ' + mousePosition.y, 
     p = document.createElement('p').innerHTM = log; 
    divLog.appendChild(p); 
}, false); 
+0

Esto solo activa la función en un 'keyup'. Creo que debería cambiar cuando el usuario presiona la tecla. Además, el evento 'mousemove' no se activa cuando el usuario no mueve el mouse. Por lo tanto, la propiedad del objeto mousePosition no se establece cuando el usuario solo presiona la tecla. – arviman

+0

Esta es la misma solución que seleccionó como respuesta. Usted ciega odio jQuery – Mohsen

+0

Oh, no hice la pregunta. Y personalmente amo jQuery. – arviman

0

Si está utilizando jQuery, puede hacer lo siguiente (suponiendo que tenga una imagen con id="wheelImage" y cuyo position es establecido en absolute), escriba lo siguiente dentro de su evento de selección. Aquí usamos las propiedades globales pageX y pageY que se pasan a cualquier controlador. También puede usar la propiedad shiftKey de jQuery para verificar si se presionó la tecla Mayús.

$().keydown(function(e) { 
    if (e.shiftKey) { 
    e.preventDefault(); 
    $('#wheelImage').css('left',e.pageX).css('top', e.pageY); 
    } 
}); 
0

Cache la posición del mouse.

var x = 0, y = 0; 
document.addEventListener('mousemove', function(e){ 
    x = e.pageX 
    y = e.pageY; 
}, false); 

document.addEventListener('keyup', function(e){ 
    console.log(x + ' ' + y); 
}, false); 

O con JS Ninja Library.

var x = 0, y = 0; 
$(document).mousemove(function(e){ 
    x = e.pageX 
    y = e.pageY; 
}); 
$(document).keypressed(function() { 
    console.log(x + ' ' + y); 
}); 
+1

Con jQuery. Porque es genial :) – rooney

+0

Este hilo recibió un montón de jQuery amor/odio, me pregunto dónde está la gente 6 años después :) – Patrick

+1

¿Qué es un jquery? – rooney

1

Aquí es el equivalente POJS de otras respuestas que es transversal navegador de nuevo a IE 6 (y probablemente IE 5 pero no tienen que probar nada más). Sin variables globales, incluso:

function addEvent(el, evt, fn) { 
    if (el.addEventListener) { 
    el.addEventListener(evt, fn, false); 
    } else if (el.attachEvent) { 
    el.attachEvent('on' + evt, fn); 
    } 
} 


(function() { 
    var x, y; 
    window.onload = function() { 
    addEvent(document.body, 'mousemove', function(e) { 
     // Support IE event model 
     e = e || window.event; 
     x = e.pageX || e.clientX; 
     y = e.pageY || e.clientY; 
    }); 

    // Show coords, assume element with id "d0" exists 
    addEvent(document.body, 'keypress', function() { 
     document.getElementById('d0').innerHTML = x + ',' + y; 
    }); 
    } 
}()); 

Pero hay problemas mayores. Los eventos clave solo se envían si un elemento que puede recibir entrada de teclado está enfocado (entrada, área de texto, etc.). Además, si el usuario se desplaza por la pantalla sin mover el mouse, las coordenadas probablemente serán incorrectas.

Una solución alternativa es usar CSS para reemplazar el cursor con una animación personalizada.

Cuestiones relacionadas