Я думаю, что разница в том, что mousemove
между mousedown
и mouseup
в перетаскивании есть, но не в щелчке.
Вы можете сделать что-то вроде этого:
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)
mousedown
иmouseup
вместо прослушиванияmousemove
события, чтобы установить флаг. Кроме того, это решило бы проблему, упомянутую @mrjrdnthmsЕсли вы уже используете jQuery:
источник
drag
. Дополнительная область, как и другие комментарии, может потребоваться здесь.evt
и сравнения с положением второгоevt
, так, например:if (evt.type === 'mouseup' || Math.abs(evt1.pageX - evt2.pageX) < 5 || Math.abs(evt1.pageY - evt2.pageY) < 5) { ...
..on('mouseup mousemove touchend touchmove')
, и, кроме того, не устанавливает переменные позиции. Отличное решение!Очиститель ES2015
Не было никаких ошибок, как другие комментируют.
источник
Это должно работать хорошо. Аналогичен принятому ответу (хотя и с использованием jQuery), но
isDragging
флаг сбрасывается только в том случае, если новая позиция мыши отличается от позиции приmousedown
событии. В отличие от принятого ответа, это работает в последних версиях Chrome, гдеmousemove
запускается независимо от того, была ли перемещена мышь или нет.Вы также можете настроить проверку координат,
mousemove
если хотите добавить немного допусков (то есть обрабатывать крошечные движения как щелчки, а не перетаскивания).источник
Если вы хотите использовать Rxjs :
Это прямой клон того, что @ wong2 сделал в своем ответе, но преобразовал в RxJs.
Также интересное использование
sample
.sample
Оператор примет последнее значение из источника (merge
изmousedown
иmousemove
) и излучает его , когда внутренние наблюдаемый (mouseup
) испускает.источник
Как указывает mrjrdnthms в своем комментарии о принятом ответе, это больше не работает в Chrome (он всегда запускает перемещение мыши), я адаптировал ответ Густаво (поскольку я использую jQuery) для учета поведения Chrome.
Array.prototype.equals
Функция исходит из этого ответаисточник
[evt.pageX, evt.pageY].equals()
команды. Я заменил это на(evt.pageX === currentPos[0] && evt.pageY===currentPos[1])
, и все было хорошо. :)equals
потребности кода должны быть добавлена по ссылке в нижней части моего постаcurrentPos
наmousemove
? Разве это не значит, что вы бы воспринимали некоторые перетаскивания как клики?"mouseup"
все еще двигаете мышь.Все эти решения либо ломаются от крошечных движений мыши, либо слишком сложны.
Вот простое адаптируемое решение с использованием двух слушателей событий. Дельта - это расстояние в пикселях, которое вы должны перемещать горизонтально или вертикально между событиями вверх и вниз, чтобы код классифицировал его как перетаскивание, а не щелчок. Это потому, что иногда вы будете двигать мышь или палец на несколько пикселей, прежде чем поднимать его.
источник
delta
используется для этого? это как-то связано с тапом в мобильном устройстве?delta
, используются для «Было бы неприятно пытаться щелкнуть мышью и получить операцию перетаскивания из-за однократного перемещения мышью»Использование jQuery с 5-пиксельным х / у-полем для определения сопротивления:
источник
Если просто отфильтровать случай перетаскивания, сделайте это так:
источник
Чистый JS с DeltaX и DeltaY
Это DeltaX и DeltaY, как предлагается в комментарии в принятом ответе, чтобы избежать неприятных ощущений при попытке щелкнуть мышью и получить операцию перетаскивания вместо этого из-за перемещения мыши в один тик.
источник
Для публичного действия на карте OSM (поместите маркер на клик) вопрос был: 1) как определить продолжительность нажатия мыши вниз -> вверх (вы не можете себе представить создание нового маркера для каждого клика) и 2) сделал мышь перемещается вниз -> вверх (т.е. пользователь перетаскивает карту).
источник
Другое решение, использующее для класса ванильный JS, использующий порог расстояния
И добавьте в класс (SOMESLIDER_ELEMENT также может быть документом, который будет глобальным):
источник
Если вы хотите проверить поведение щелчка или перетаскивания определенного элемента, вы можете сделать это без прослушивания тела.
источник
из ответа @Przemek,
источник