Это довольно быстро и грязно, но это должно дать вам начало. По сути, вы хотите установить несколько начальных «констант», с которыми вы можете играть, чтобы получить желаемое поведение. Начальное время между приращениями составляет 1000 мс, и на каждой итерации оно становится равным 90% от этого (1000, 990, 891, ... 100) и перестает уменьшаться при 100 мс. Вы можете настроить этот фактор для ускорения или замедления. Остальное, я верю, довольно близко к тому, к чему, я думаю, вы стремились. Похоже, вы просто пропустили мероприятия. В window.onload
вы увидите, что я назначаю события onmouseup
и onmousedown
функциям, которые просто вызывают функции increment()
или decrement()
с вашим начальным таймаутом, или функцию ClearTimeout()
для остановки счетчик.
РЕДАКТИРОВАТЬ: Я немного изменил это, чтобы исправить ошибку. Теперь, если вы переместите указатель мыши с кнопки и отпустите кнопку, счетчик будет остановлен.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title><!-- Insert your title here --></title>
<script>
// Fake Constants
var INITIAL_TIME = 1000;
var ACCELERATION = .9;
var MIN_TIME = 100;
// create global variables to hold DOM objects, and timer
var up = null,
down = null,
count = null,
timer = null;
// Increment the counter
function increment (time) {
// decrease timeout by our acceleration factor, unless it's at the minimum
time = (time * ACCELERATION > MIN_TIME) ? (time * ACCELERATION) : MIN_TIME;
count.value ++ ;
// set the timeout for the next round, and pass in the new smaller timeout
timer = setTimeout(
function () {
increment(time);
}, time);
}
// Same as increment only subtracts one instead of adding.
// -- could easily make one function and pass an pos/neg factor instead
function decrement (time) {
time = time * ACCELERATION > MIN_TIME ? (time * ACCELERATION) : MIN_TIME;
count.value --;
timer = setTimeout(
function () {
decrement(time);
}, time);
}
// Initialize the page after all the forms load
window.onload = function () {
// initialization function
// assign DOM objects to our vars for ease of use.
up = document.getElementById('up_btn');
down = document.getElementById('dwn_btn');
count = document.getElementById('count');
// create event handlers for mouse up and down
up.onmousedown = function () {
increment(INITIAL_TIME);
}
down.onmousedown = function () {
decrement(INITIAL_TIME);
}
document.onmouseup = function () {
clearTimeout(timer);
}
}
</script>
</head>
<body>
<!-- Insert your content here -->
<form name="the_form">
<input type="button" value="Up" id="up_btn" /><br />
<input type="button" value="Down" id="dwn_btn" /></br>
<br />
Count:
<input type="text" value="0" id="count" />
</form>
</body>
</html>