jQuery - 避免在函数执行时听箭头键
jQuery - avoid listening to arrow keys while function is executing
场景
我用 jQuery 开发了一个函数,它监听用户的键盘(基于 keydown()
方法)。
我使用 evt.keyCode
分析用户的输入,如果按下或向上箭头键,则会执行动画平滑滚动。
问题
动画持续1秒。
我不希望函数在动画执行期间侦听任何输入。
也就是说,如果用户在1秒内多次按下上下方向键,则只考虑第一次,直到执行时间(1秒)结束,其余的击键应该被丢弃。
我怎样才能做到这一点?
JS代码
$(function () {
$(document).keydown(function (evt) {
if (evt.keyCode == 40) {
$('html,body').animate({scrollTop: 50}, 1000);
} else if (evt.keyCode == 38) {
$('html,body').animate({scrollTop: 0}, 1000);
}
return false;
});
});
按下按键时设置标志,在动画结束时重置标志:
var isAnimating = false;
$(document).keydown(function (evt) {
if (isAnimating == false) {
isAnimating = true;
} else {
return;
}
if (evt.keyCode == 40) {
$('html,body').animate({scrollTop: 50}, 1000, function() {
isAnimating = false;
});
} else if (evt.keyCode == 38) {
$('html,body').animate({scrollTop: 0}, 1000, function() {
isAnimating = false;
});
}
return false;
});
检查您是否已经在使用 .is(":animated")
制作动画
$(function () {
$(document).keydown(function (evt) {
if ($('html,body').is(":animated")){
return false;
}
if (evt.keyCode == 40) {
$('html,body').animate({scrollTop: 50}, 1000);
} else if (evt.keyCode == 38) {
$('html,body').animate({scrollTop: 0}, 1000);
}
return false;
});
});
.animate() method can call a function when it is completed. You could remove the event handler using .off(),动画完成后重新添加
$(function () {
function attachOnKeydown() {
$(document).on('keydown', onKeydown);
}
function onKeydown(evt) {
// Detach onKeyDown()
$(document).off('keydown', onKeydown);
if (evt.keyCode == 40) {
$('html,body').animate({scrollTop: 50}, 1000, attachOnKeydown);
} else if (evt.keyCode == 38) {
$('html,body').animate({scrollTop: 0}, 1000, attachOnKeydown);
}
return false;
}
attachOnKeydown();
});
场景
我用 jQuery 开发了一个函数,它监听用户的键盘(基于 keydown()
方法)。
我使用 evt.keyCode
分析用户的输入,如果按下或向上箭头键,则会执行动画平滑滚动。
问题
动画持续1秒。
我不希望函数在动画执行期间侦听任何输入。
也就是说,如果用户在1秒内多次按下上下方向键,则只考虑第一次,直到执行时间(1秒)结束,其余的击键应该被丢弃。
我怎样才能做到这一点?
JS代码
$(function () {
$(document).keydown(function (evt) {
if (evt.keyCode == 40) {
$('html,body').animate({scrollTop: 50}, 1000);
} else if (evt.keyCode == 38) {
$('html,body').animate({scrollTop: 0}, 1000);
}
return false;
});
});
按下按键时设置标志,在动画结束时重置标志:
var isAnimating = false;
$(document).keydown(function (evt) {
if (isAnimating == false) {
isAnimating = true;
} else {
return;
}
if (evt.keyCode == 40) {
$('html,body').animate({scrollTop: 50}, 1000, function() {
isAnimating = false;
});
} else if (evt.keyCode == 38) {
$('html,body').animate({scrollTop: 0}, 1000, function() {
isAnimating = false;
});
}
return false;
});
检查您是否已经在使用 .is(":animated")
制作动画$(function () {
$(document).keydown(function (evt) {
if ($('html,body').is(":animated")){
return false;
}
if (evt.keyCode == 40) {
$('html,body').animate({scrollTop: 50}, 1000);
} else if (evt.keyCode == 38) {
$('html,body').animate({scrollTop: 0}, 1000);
}
return false;
});
});
.animate() method can call a function when it is completed. You could remove the event handler using .off(),动画完成后重新添加
$(function () {
function attachOnKeydown() {
$(document).on('keydown', onKeydown);
}
function onKeydown(evt) {
// Detach onKeyDown()
$(document).off('keydown', onKeydown);
if (evt.keyCode == 40) {
$('html,body').animate({scrollTop: 50}, 1000, attachOnKeydown);
} else if (evt.keyCode == 38) {
$('html,body').animate({scrollTop: 0}, 1000, attachOnKeydown);
}
return false;
}
attachOnKeydown();
});