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í:
var mouseDown = 0;
document.body.onmousedown = function() {
++mouseDown;
}
document.body.onmouseup = function() {
--mouseDown;
}
Con la prueba como esta:
if(mouseDown){
// crikey! isn't she a beauty?
}
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:
// let's pretend that a mouse doesn't have more than 9 buttons
var mouseDown = [0, 0, 0, 0, 0, 0, 0, 0, 0],
mouseDownCount = 0;
document.body.onmousedown = function(evt) {
++mouseDown[evt.button];
++mouseDownCount;
}
document.body.onmouseup = function(evt) {
--mouseDown[evt.button];
--mouseDownCount;
}
Ahora puede verificar qué botones se presionaron exactamente:
if(mouseDownCount){
// alright, let's lift the little bugger up!
for(var i = 0; i < mouseDown.length; ++i){
if(mouseDown[i]){
// we found it right there!
}
}
}
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:
- 0 para "nada se presiona"
- 1 para la izquierda
- 2 por derecho
- 4 para el medio
- y cualquier combinación de arriba, por ejemplo, 5 para izquierda + medio
¡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:
// for IE only!
document.body.onmousemove = function(){
if(event.button){
// aha! we caught a feisty little sheila!
}
};
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.