2008-09-17 9 views
11

Me gustaría una rutina de javascript más corta posible que cuando un mousedown ocurre en un botón, primero responde como un clic de ratón y luego, si el usuario mantiene presionado el botón, responde como si el usuario estaba continuamente enviando clics del mouse y después de un tiempo con el botón presionado actúa como si el usuario estuviera acelerando sus clics de mouse ... básicamente piense en ello como una repetición de tecla presionada con aceleración en el tiempo.
es decir usuario mantiene pulsado el botón del ratón (x = función de llamada) - x___x___x___x__x__x_x_x_x_xxxxxxxNecesito el código de Javascript para presionar y mantener oprimido el botón

Respuesta

13
function holdit(btn, action, start, speedup) { 
    var t; 

    var repeat = function() { 
     action(); 
     t = setTimeout(repeat, start); 
     start = start/speedup; 
    } 

    btn.mousedown = function() { 
     repeat(); 
    } 

    btn.mouseup = function() { 
     clearTimeout(t); 
    } 
}; 

/* to use */ 
holdit(btn, function() { }, 1000, 2); /* x..1000ms..x..500ms..x..250ms..x */ 
+0

gracias. Agregué una función de registro para la curva exponencial en lugar de la lineal, pero eso es casi exactamente lo que estaba buscando. – zurk

+2

Necesitaba borrar el tiempo de espera en mouseout también, de lo contrario podría deslizar el mouse fuera del botón y luego el desplazamiento continuaría. – edward

+0

Corrígeme si me equivoco, pero parece que tienes algunos puntos y comas fuera de lugar, las declaraciones de funciones internas necesitan punto y coma y la declaración de función externa no. –

3

Cuando se pulsa el botón, llame window.setTimeout con su tiempo previsto y la función de x, y ajustar el temporizador de nuevo al final de x pero esta vez con un intervalo más pequeño.

Elimine el tiempo de espera usando window.clearTimeout al soltar el botón del mouse.

+0

Estaba ocupado tratando de escribir el código para él, pero decidí no hacerlo y, mientras tanto, publicaste esto y era exactamente en lo que estaba trabajando. Muy agradable. –

-1

algo así como debajo de la pseudo código podría funcionar ..

var isClicked = false; 
var clickCounter = 100; 
function fnTrackClick(){ 
    if(isClicked){ 
     clickCounter--; 
     setTimeout(clickCounter * 100, fnTrackClick); 
    } 
} 

<input type="button" value="blah" onmousedown="isClicked=true;" onmouseover="fnTrackClick();" onmouseup="isClicked = false;" /> 
0

Sólo hay que poner el siguiente toggleOn en el OnMouseDown y toggleOff en el onmouseup del botón.

var tid = 0; 
var speed = 100; 

function toggleOn(){ 
    if(tid==0){ 
     tid=setInterval('ThingToDo()',speed); 
    } 
} 
function toggleOff(){ 
    if(tid!=0){ 
     clearInterval(tid); 
     tid=0; 
    } 
} 
function ThingToDo{ 

} 
+0

Esta es una solución simple que funciona, pero usa variables globales. También prefiero otras soluciones donde cada iteración llama al siguiente, tanto para una lógica más segura como porque cada llamada puede cambiar la duración del intervalo (para la aceleración). –

-1

Me basta con soltar un plugin de jQuery, comprobar esto demo en este repo.

$('button').clickAndHold(function (e, n) { 
    console.log("Call me baby ", n); 
}); 
Cuestiones relacionadas