Так что у сенсорных событий разная «философия», когда речь заходит о том, как они взаимодействуют:
- Мышь движется = "зависание" как поведение
- Касание движется = "перетаскивает" как поведение
Эта разница обусловлена тем фактом, что не может быть движением касания без события touchstart, предшествующего ему, поскольку пользователь должен коснуться экрана, чтобы начать это взаимодействие. Конечно, с помощью мыши пользователь может перемещать мышь по всему экрану, даже не нажимая кнопку (событие mousedown)
Вот почему в основном мы не можем надеяться использовать такие вещи, как эффекты при наведении, с сенсорным:
element:hover {
background-color: yellow;
}
И именно поэтому, когда пользователь касается экрана одним пальцем, первое событие (сенсорный запуск) получает целевой элемент, а последующие события (сенсорное движение) будут содержать ссылку на исходный элемент, с которого началось касание. Это неправильно, но есть логика, что вам может понадобиться и оригинальная информация о цели. Так что в идеале в будущем должны быть доступны и исходная цель, и текущая цель.
Так что обычная практика сегодняшнего дня (2018), когда экраны могут быть одновременно мышкой и сенсорным, все еще заключается в том, чтобы прикреплять обоих слушателей (мышку и касание), а затем «нормализовать» координаты события и использовать вышеупомянутые API браузера для поиска элемента в эти координаты:
// get coordinates depending on pointer type:
var xcoord = event.touches? event.touches[0].pageX : event.pageX;
var ycoord = event.touches? event.touches[0].pageY : event.pageY;
// get element in coordinates:
var targetElement = document.elementFromPoint(xcoord, ycoord);
// validate if this is a valid element for our case:
if (targetElement && targetElement.classList.contains("dropZone")) {
}