Это законный, но бесполезный шаблон. Все расширяет Object, поэтому спецификация языка позволяет вам оставить его, и его вообще следует оставить без внимания (некоторые авторы стандартов кодирования не согласны).
Ситуация такая же в generics (extends Object неявно и избыточно), это просто по какой-то причине (я видел, как некоторые ранние ошибки с ошибками в Generics имели проблемы с подстановочным знаком?), он обнаружил там немного больше.
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 */
При нажатии кнопки звонить window.setTimeout
с Вашим намеченным временем и функцией x
, и набор таймер снова в конце x
но на этот раз с меньшим интервалом.
Очистите использование тайм-аута window.clearTimeout
после выпуска кнопки мыши.
что-то как код psuedo ниже могло бы работать..
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;" />
@glenuular: Спасибо за этот интересный подход! Были некоторые небольшие проблемы с ним: - величина запуска не была перезагружена, таким образом, на втором использовании она запустилась слишком быстро. - Величина запуска была разделена без предела, таким образом, это стало очень маленьким после короткого времени. - Аргументы не были переданы к названному методу. (Теперь ограниченный 6 args, обычно достаточными для прохождения 'ev').
function holdit( btn, method, start, speedup ) {
var t, keep = start;
var repeat = function () {
var args = Array.prototype.slice.call( arguments );
method.apply( this, args );
t = setTimeout( repeat, start, args[0], args[1], args[2], args[3], args[4], args[5] );
if ( start > keep / 20 ) start = start / speedup;
}
btn.onmousedown = btn.mousedown = repeat;
//
btn.onmouseout = btn.mouseout = btn.onmouseup = btn.mouseup = function () {
clearTimeout( t );
start = keep;
}
};
Просто поместите ниже toggleOn в OnMouseDown и toggleOff в OnMouseUp кнопки.
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{
}