2010-10-20 7 views
22

Necesito una función que ejecuta una función mientras se pulsa un botón y deja de ejecutarse cuando el botón se soltóJquery: efecto mousedown (mientras clic izquierdo se mantiene pulsado)

$('#button').--while being held down--(function() { 
    //execute continuously 
}); 
+0

Eche un vistazo a mi pregunta, que se basa en esta. Hay una mejora en este caso: http://stackoverflow.com/questions/36316638/jquery-mousdown-with-setinterval-endless – Steckdoserich

Respuesta

46

creo que algo como esto haría trabajo:

var timeout, clicker = $('#clicker'); 

clicker.mousedown(function(){ 
    timeout = setInterval(function(){ 
     // Do something continuously 
    }, 500); 

    return false; 
}); 

$(document).mouseup(function(){ 
    clearInterval(timeout); 
    return false; 
}); 

ver este demo: http://jsfiddle.net/8FmRd/

+12

Un problema: si se suelta del área de golpe, el efecto se repite para siempre. Probablemente debería considerar tener la función 'mouseup' en todo el documento, en lugar de simplemente' clicker'. – Jeriko

+2

@Jeriko Tienes razón. Estoy editando mi respuesta ahora –

+0

O en lugar de la solución setInterval, podría querer usar el evento mousemove. – kapa

17

Una pequeña modificación de la respuesta original:

$('#Clicker').mousedown(function() { 
    //do something here 
    timeout = setInterval(function() { 
     //do same thing here again 
    }, 500); 

    return false; 
}); 
$('#Clicker').mouseup(function() { 
    clearInterval(timeout); 
    return false; 
}); 
$('#Clicker').mouseout(function() { 
    clearInterval(timeout); 
    return false; 
}); 

Con el evento mouseout en el Clicker, se detiene cuando mueve el mouse fuera del área de clic.

La razón por la que sugiero hacer lo mismo dos veces es para obtener un efecto más suave. Si no lo hace una vez antes de que se establezca el tiempo de espera, habrá un retraso de, en este caso, 500 ms antes de que ocurra algo.

1
$.fn.click2=function(cb,interval){ 
    var timeout; 
    if(!interval) interval=100; 
    $(this).mousedown(function() { 
     var target=this; 
     timeout = setInterval(function(){ 
      cb.apply(target); 
     }, interval); 

    return false; 
    }).mouseup(function() { 
     clearInterval(timeout); 
     return false; 
    }).mouseout(function() { 
     clearInterval(timeout); 
     return false; 
    }); 
} 
1

He aquí una implementación de JavaScript pura de las soluciones suministradas que tiene soporte extendido para pantallas táctiles. Usted suministra el id, action para realizar (function(){}) y el interval (ms) para repetir el action. Tenga en cuenta que esta implementación también ejecutará el action inmediatamente, en lugar de esperar a que caduque el interval.

// Configures an element to execute a function periodically whilst it holds the user's attention via a mouse press and hold. 
function assertPeriodicPress(id, action, interval) { 
    // Listen for the MouseDown event. 
    document.getElementById(id).addEventListener('mousedown', function(ev) { action(); timeout = setInterval(action, interval); return false; }, false); 
    // Listen for mouse up events. 
    document.getElementById(id).addEventListener('mouseup', function(ev) { clearInterval(timeout); return false; }, false); 
    // Listen out for touch end events. 
    document.getElementById(id).addEventListener('touchend', function(ev) { clearInterval(timeout); return false; }, false); 
} 
Cuestiones relacionadas