大家都知道,鼠標點擊的整個事件的執行流程是:mousedown -> mouseup -> click ,而拖放的整個流程是:mousedown -> mousemove -> mouseup -> click
可以來看一個正常 demo,可以分別測試點擊和拖放動作
我們試着給 #box 加上title屬性再來分別試試點擊事件和拖放事件
可以發現點擊也會觸發 mousemove 事件,原因就在於 title。
並且 title 屬性有個特性,就是在你鼠標按下的時候,提示文字會隱藏,鼠標抬起則又顯示,所以你可以嘗試下雙擊,會發現第 2 次點擊會觸發 click 事件,因為第 1 次點擊后 title 還沒有顯示出來就進行了第 2 次點擊,則正常觸發 click 事件。
發現這一點后,我們就可以試着避免這個小問題,因為在一些情況下,一個對象可能需要同時具備拖放和點擊功能,並且保證這兩個功能不會沖突。最簡單的辦法就是避免使用 title 屬性,或者你可以參考我在 HoorayOS 里的實現:
在 mousedown 和 mouseup 時分別記錄對象的坐標,並進行對比,如果完全一致則表示對象未進行拖動,否則代表對象已經拖動,這時就可以在 mouseup 里分別處理這兩種情況。具體代碼可以查看:點擊查看
PS:該問題目前僅在 chrome 下發現有,其他瀏覽器似乎沒有出現。