我正在制作一个滑块,我检测鼠标的位置以定义点击事件。我创建了一个$(document).on('mousemove')
事件,当我在该位置时,我想要点击一下,我添加了一个on('click')
事件,但在这种情况下,事件被调用了这么多次,而不是一次。
让我们看看这段代码。这是一个简单的例子:jsFiddle
var widthScreen = $(window).width();
$(document).on('mousemove', function(e) {
console.log(e.pageX);
if (e.pageX > (widthScreen - 120) && e.pageX < widthScreen) {
$('ul').addClass('right-show');
$('li').eq(2).on('click', function() {
console.log('too much click');
});
} else {
$('ul').removeClass('right-show');
}
});
我该如何解决这个问题?
答案 0 :(得分:2)
当您执行鼠标移动时,它正在检查条件并附加单击事件。所以click事件多次附加。要避免这种情况,请先使用off('click')
删除点击事件并附加。这是更新的fiddle。
var widthScreen = $(window).width();
$(document).on('mousemove', function(e) {
console.log(e.pageX);
if (e.pageX > (widthScreen - 120) && e.pageX < widthScreen) {
$('ul').addClass('right-show');
$('li').eq(2).off('click').on('click', function() {
console.log('too much click');
});
} else {
$('ul').removeClass('right-show');
}
});
答案 1 :(得分:1)
从mousemove处理程序中删除事件附件,如果光标位于正确的位置,则创建一个要检查的标志:
var widthScreen = $(window).width(),
onArea = false;
$(document).on('mousemove', function(e) {
if (e.pageX > (widthScreen - 120) && e.pageX < widthScreen) {
$('ul').addClass('right-show');
onArea = true;
} else {
$('ul').removeClass('right-show');
onArea = false;
}
});
$('li').eq(2).on('click', function(e) {
if (onArea) {
console.log('Not too much clicks.');
}
});
答案 2 :(得分:0)
看看underscore.js油门功能:
_.throttle(function, wait, [options])
创建并返回传递函数的新的受限制版本,当重复调用时,每隔等待毫秒最多只调用一次原始函数。对于速度限制事件非常有用,这些事件发生得比你能跟上
更快答案 3 :(得分:0)
使用.one()代替.on()Here