2013-02-19 2 views
3

У меня есть событие mousedown с setinterval. Я хочу, чтобы время интервалов было переменным. Итак, первый из них 500, второй 500/2 = 250 и т. Д. Любые подсказки?Setinterval с экспоненциальным уменьшением времени

$plus.mousedown(function(e) { 
    increment(20) 
    timeout = setInterval(function(){ 
     increment(20) 
    }, 500); 
}); 
$(document).mouseup(function(){ 
    clearInterval(timeout); 
    return false; 
}); 

Приветствия!

EDIT: извините за двусмысленность. Я хочу, чтобы время интервала менялось во время мускулатуры. Таким образом, в то время как mousedown выполняется, интервал времени должен измениться. Поэтому не каждым щелчком мыши, а с каждым непрерывным щелчком, а затем снова сбрасывайте его.

+0

a) Используйте переменную b) разделите ее на 2 каждый раз, когда вы нажимаете? – Bergi

ответ

5

Вы не можете сделать это с setInterval(), если вы не держите очистки для изменения задержки, так что вы могли бы также написать оболочку вокруг setTimeout() сделать что-то подобное:

function easingTimeout(delay, fn) 
{ 
    var id, 
    invoker = function() { 
    fn(); 
    delay = Math.floor(delay/2); 
    if (delay) { 
     id = setTimeout(invoker, delay); 
    } else { 
     id = null; 
    } 
    } 

    // start it off 
    id = setTimeout(invoker, delay); 

    return { 
    clear: function() { 
     if (id) { 
     clearTimeout(id); 
     id = null; 
     } 
    } 
} 

использовать:

var timeout; 

$plus.mousedown(function(e) { 
    increment(20); 
    timeout = easingTimeout(500, function() { 
     increment(20); 
    }); 
}); 

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

Это решение не зависит от JQuery:

var timeoutInterval = 500; 
var mousedown = false; 

function incrementAndWait() { 
    if (!mousedown) return; 
    increment(20); 
    timeout = setTimeout(incrementAndWait, timeoutInterval); 
    timeoutInterval /= 2; 
} 

document.onmousedown = function() { 
    timeoutInterval = 500; // Reset to 500 to allow multiple mousedown/mouseup 
    mousedown = true; 
    incrementAndWait(); 
}; 

document.onmouseup = function() { 
    mousedown = false; 
} 

Вы можете добавить console.log((new Date).getTime(), 20); к методу incrementAndWait, чтобы увидеть номера, идущие на консоли. С чем-то весело играть :)

Смежные вопросы