我jQuery.click
用来处理 Raphael 图上的鼠标点击事件,同时,我需要处理鼠标drag
事件,鼠标拖动由mousedown
,mouseup
和mousemove
Raphael 组成。
很难区分click
,drag
因为click
也包含mousedown
& mouseup
,如何在Javascript中区分鼠标“单击”和鼠标“拖动”?
我jQuery.click
用来处理 Raphael 图上的鼠标点击事件,同时,我需要处理鼠标drag
事件,鼠标拖动由mousedown
,mouseup
和mousemove
Raphael 组成。
很难区分click
,drag
因为click
也包含mousedown
& mouseup
,如何在Javascript中区分鼠标“单击”和鼠标“拖动”?
我认为不同之处在于拖动中有一个mousemove
betweenmousedown
和mouseup
in ,而不是 click 。
你可以这样做:
const element = document.createElement('div')
element.innerHTML = 'test'
document.body.appendChild(element)
let moved
let downListener = () => {
moved = false
}
element.addEventListener('mousedown', downListener)
let moveListener = () => {
moved = true
}
element.addEventListener('mousemove', moveListener)
let upListener = () => {
if (moved) {
console.log('moved')
} else {
console.log('not moved')
}
}
element.addEventListener('mouseup', upListener)
// release memory
element.removeEventListener('mousedown', downListener)
element.removeEventListener('mousemove', moveListener)
element.removeEventListener('mouseup', upListener)
let drag = false;
document.addEventListener('mousedown', () => drag = false);
document.addEventListener('mousemove', () => drag = true);
document.addEventListener('mouseup', () => console.log(drag ? 'drag' : 'click'));
没有遇到任何错误,正如其他人评论的那样。
如果您已经在使用 jQuery:
var $body = $('body');
$body.on('mousedown', function (evt) {
$body.on('mouseup mousemove', function handler(evt) {
if (evt.type === 'mouseup') {
// click
} else {
// drag
}
$body.off('mouseup mousemove', handler);
});
});
所有这些解决方案要么因微小的鼠标移动而中断,要么过于复杂。
这是一个使用两个事件侦听器的简单适应性解决方案。Delta 是以像素为单位的距离,您必须在向上和向下事件之间水平或垂直移动代码才能将其归类为拖动而不是点击。这是因为有时您会在抬起鼠标或手指之前将其移动几个像素。
const delta = 6;
let startX;
let startY;
element.addEventListener('mousedown', function (event) {
startX = event.pageX;
startY = event.pageY;
});
element.addEventListener('mouseup', function (event) {
const diffX = Math.abs(event.pageX - startX);
const diffY = Math.abs(event.pageY - startY);
if (diffX < delta && diffY < delta) {
// Click!
}
});
这应该很好用。类似于已接受的答案(尽管使用 jQuery),但isDragging
仅当新鼠标位置与mousedown
事件上的位置不同时才会重置标志。与公认的答案不同,它适用于最新版本的 Chrome,mousemove
无论鼠标是否移动,都会触发。
var isDragging = false;
var startingPos = [];
$(".selector")
.mousedown(function (evt) {
isDragging = false;
startingPos = [evt.pageX, evt.pageY];
})
.mousemove(function (evt) {
if (!(evt.pageX === startingPos[0] && evt.pageY === startingPos[1])) {
isDragging = true;
}
})
.mouseup(function () {
if (isDragging) {
console.log("Drag");
} else {
console.log("Click");
}
isDragging = false;
startingPos = [];
});
mousemove
如果您想增加一点容差(即将微小的移动视为点击,而不是拖动),您也可以调整坐标检入。