我想要一个简短的最小可能的javascript例程,当一个按钮上发生鼠标按下时,它首先响应就像单击鼠标一样,然后如果用户按住按钮,它会响应,就好像用户不断发送鼠标点击一样,一段时间后使用按下按钮就像用户正在加速他们的鼠标点击......基本上把它想象成一个随着时间加速的按键重复。
即用户按住鼠标按钮(x=调用函数) - x___x___x___x__x__x_x_x_x_xxxxxxx
zurk
问问题
34169 次
7 回答
19
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 */
于 2008-09-17T04:25:29.390 回答
4
按下按钮时,window.setTimeout
使用您的预期时间和功能调用x
,并在结束时再次设置计时器,x
但这次间隔更小。
window.clearTimeout
释放鼠标按钮时使用清除超时。
于 2008-09-17T03:58:57.270 回答
2
只需将下面的 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{
}
于 2008-09-17T04:10:38.677 回答
0
@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;
}
};
于 2019-10-04T13:37:24.393 回答
0
我升级了 neouser99 解决方案,因为我遇到了一些问题^^
let holdIt = (btn, action, start, speedup, limit) => {
let t;
let startValue = start;
let repeat = () => {
action();
t = setTimeout(repeat, startValue);
(startValue > limit) ? startValue /= speedup: startValue = limit;
}
btn.onmousedown = () => {
repeat();
}
const stopActionEvents = ['mouseup', 'mouseout'];
stopActionEvents.forEach(event => {
btn.addEventListener(event, () => {
clearTimeout(t);
startValue = start;
})
});
};
holdIt(actionButton, functionToDo, 500, 2, 5);
于 2021-12-29T15:41:49.743 回答
-1
类似下面的伪代码可能会起作用..
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;" />
于 2008-09-17T04:04:17.350 回答