我創建了一個Fiddle來演示我的情況。jQuery - 不要在'mousemove'上點擊'點擊'
我想在用戶平移時不觸發點擊事件 - 只有當它只是一個簡單的點擊。我嘗試過使用.off()和.on()的不同位置來無濟於事。
在此先感謝您的幫助。
我創建了一個Fiddle來演示我的情況。jQuery - 不要在'mousemove'上點擊'點擊'
我想在用戶平移時不觸發點擊事件 - 只有當它只是一個簡單的點擊。我嘗試過使用.off()和.on()的不同位置來無濟於事。
在此先感謝您的幫助。
http://jsfiddle.net/Waxen/syTKq/3/
更新你的小提琴做你想做的。我把超時事件的重新綁定所以它不會立即觸發,並調整了鼠標移動到
完美。謝謝! (對不起,我延長了假期) – MJS 2012-02-23 19:53:30
您可以使用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/
在上單擊事件,可以檢測鼠標是否被按下向下或向上。因此,讓我們分析一下:
DRAG:
mouse down
mosue position changes
mouse up
CLICK:
mouse down
mouse up
你看 - 不同的是改變鼠標的位置。您可以在鼠標下方的記錄點擊座標,然後在muse恢復時進行比較。如果它在某個閾值內爲,則動作是點擊。
我加了一個「平移」布爾一個解決問題的方法:
看到http://jsfiddle.net/syTKq/4/
基本上,如果用戶的mousedown和鼠標移動,然後平移是真的。一旦mouseup平移是錯誤的。如果只是被ousedown,平移是錯誤的,因此放大。
你的小提琴仍然存在你綁定每個'mouseup'事件的'click'事件處理程序的問題。 – 2012-02-17 18:31:23
你是對的,但我只是提供了一個解決問題的辦法,並沒有在他們的代碼邏輯中修復所有的東西。 – Vigrond 2012-02-17 18:33:04
該解決方案可以解決你的問題:
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()
只有當鼠標未在mousedown
和mouseup
事件之間移動。
可以添加簡單的邏輯來防止它發生。 IMO我的解決方案是用戶期望的 - 當鼠標不在「mousedown」和「mouseup」事件之間移動時,點擊只是一個點擊。 – satoshi 2012-02-17 19:49:29
只需在鼠標移動時設置一個標誌。然後在'click'事件處理程序中,查看標誌是否已設置並分別清除。 – 2012-02-17 18:29:55