2012-02-17 91 views
3

我创建了一个Fiddle来演示我的情况。jQuery - 不要在'mousemove'上点击'点击'

我想在用户平移时不触发点击事件 - 只有当它只是一个简单的点击。我尝试过使用.off()和.on()的不同位置来无济于事。

在此先感谢您的帮助。

+0

只需在鼠标移动时设置一个标志。然后在'click'事件处理程序中,查看标志是否已设置并分别清除。 – 2012-02-17 18:29:55

回答

2

http://jsfiddle.net/Waxen/syTKq/3/

更新你的小提琴做你想做的。我把超时事件的重新绑定所以它不会立即触发,并调整了鼠标移动到

+0

完美。谢谢! (对不起,我延长了假期) – MJS 2012-02-23 19:53:30

0

在“点击”和“平移”之间进行区分的唯一方法是鼠标花费的时间。你可以在mousedown中创建一个Date,然后在mouseup中创建一个Date,如果两个日期之间的差异大于某个阈值(我猜可能是1/10秒,但是你可以想要实验)

+0

这很糟糕。既然你要将快速拖动解释为点击。 – 2012-02-17 18:28:00

+0

'唯一的方法'...真的吗? – Jasper 2012-02-17 18:37:49

+0

@RokKralj这就是为什么你需要试验并找到适合你的用户的阈值。在处理阈值时,永远不会有正确的答案。 – jbabey 2012-02-17 18:38:09

0

您可以使用mousemove/mousedown事件来设置可用于click事件处理程序的标志,以确定用户是在单击还是在平移。喜欢的东西:

//set a flag for the click event to check 
var isClick = false; 

//bind to `mousedown` event to set the `isClick` flag to true 
$(document).on('mousedown', function (event) { 
    isClick = true; 

//bind to `mousemove` event to set the `isClick` flag to false (since it's not a drag 
}).on('mousemove', function() { 
    isClick = false; 

//bind to `click` event, check to see if the `isClick` flag is set to true, if so then this is a click, otherwise this is a drag 
}).on('click', function() { 
    if (isClick) { 
     console.log('click'); 
    } else { 
     console.log('drag'); 
    } 
});​​ 

这里是一个演示:http://jsfiddle.net/SU7Ef/

1

在上单击事件,可以检测鼠标是否被按下向下或向上。因此,让我们分析一下:

DRAG: 
mouse down 
mosue position changes 
mouse up 

CLICK: 
mouse down 
mouse up 

你看 - 不同的是改变鼠标的位置。您可以在鼠标下方的记录点击坐标,然后在muse恢复时进行比较。如果它在某个阈值内为,则动作是点击。

0

我加了一个“平移”布尔一个解决问题的方法:

看到http://jsfiddle.net/syTKq/4/

基本上,如果用户的mousedown和鼠标移动,然后平移是真的。一旦mouseup平移是错误的。如果只是被ousedown,平移是错误的,因此放大。

+1

你的小提琴仍然存在你绑定每个'mouseup'事件的'click'事件处理程序的问题。 – 2012-02-17 18:31:23

+0

你是对的,但我只是提供了一个解决问题的办法,并没有在他们的代码逻辑中修复所有的东西。 – Vigrond 2012-02-17 18:33:04

0

该解决方案可以解决你的问题:

var bClicking = false, 
    moved = false;; 
var previousX, previousY; 
var $slider = $('#slider'), 
    $wrapper = $slider.find('li.wrapper'), 
    $img = $slider.find('img.foo'); 

$img.on('click', function() 
{ 
    if(!moved) 
    { 
     doZoom(); 
    } 
}); 

$wrapper.mousedown(function(e) { 
    e.preventDefault(); 

    previousX = e.clientX; 
    previousY = e.clientY; 
    bClicking = true; 
    moved = false; 
}); 

$(document).mouseup(function(e) { 
    bClicking = false; 
}); 

$wrapper.mousemove(function(e) { 
    if (bClicking) 
    { 
     moved = true; 
     var directionX = (previousX - e.clientX) > 0 ? 1 : -1; 
     var directionY = (previousY - e.clientY) > 0 ? 1 : -1; 

     $(this).scrollLeft($(this).scrollLeft() + 10 * directionX); 
     $(this).scrollTop($(this).scrollTop() + 10 * directionY); 

     previousX = e.clientX; 
     previousY = e.clientY; 
    } 
}); 

function doZoom() { 
    $img.animate({ 
     height: '+=300', 
     width: '+=300' 
    }, 500, function() { 
     //animation complete 
    }); 
}​ 

基本上,它调用doZoom()只有当鼠标未在mousedownmouseup事件之间移动。

+0

可以添加简单的逻辑来防止它发生。 IMO我的解决方案是用户期望的 - 当鼠标不在“mousedown”和“mouseup”事件之间移动时,点击只是一个点击。 – satoshi 2012-02-17 19:49:29