Нужен код javascript для нажатия и удержания кнопки

Мне нужна кратчайшая возможная javascript-процедура, которая, когда музайдад появляется на кнопке, сначала отвечает так же, как музеклик, а затем, если пользователь удерживает кнопку нажатой, он реагирует так, как будто пользователь постоянно посылает mouseclicks и после в то время как нажатая кнопка действует так, как если бы пользователь ускорял их mouseclicks... в основном думают об этом, как повторение клавиши с ускорением во времени.
то есть пользователь удерживает кнопку мыши (x = функция вызова) - x ___ x ___ x ___ x__x__x_x_x_x_xxxxxxx

Ответ 1

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 */

Ответ 2

Когда кнопка нажата, вызовите window.setTimeout с назначенным временем и функцией x и установите таймер снова в конце x, но на этот раз с меньшим интервалом.

Снимите тайм-аут с помощью window.clearTimeout после отпускания кнопки мыши.

Ответ 3

Просто поставьте внизу 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{

}

Ответ 4

@glenuular: Спасибо за этот интересный подход! Были некоторые небольшие проблемы с этим: - Начальное значение не было сброшено, поэтому при втором использовании оно началось слишком быстро. - Начальное значение было разделено без ограничений, поэтому через короткое время оно стало очень маленьким. - Аргументы не были переданы вызываемому методу. (Теперь ограничено 6 аргументами, обычно достаточно, чтобы передать '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;
    }
};

Ответ 5

что-то вроде кода 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;" />

Ответ 6

Я только что выпустил плагин jQuery, проверьте этот demo на этом репо.

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