2012-02-17 85 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