У меня есть меню, которое на узком экране должно прокручиваться зажатой клавишей мыши:
Код, который я написал, еще далек от идеала, но я все равно приведу его для примера:
this.delta = 0;
this.contentEl.addEventListener('click', ev => {
ev.preventDefault();
});
this.contentEl.addEventListener('mousedown', ev => {
const startPoint = ev.clientX;
const moveHandler = (ev) => {
this.delta = ev.clientX - startPoint;
this.contentEl.style.marginLeft = this.marginLeft + this.delta + 'px';
}
this.contentEl.addEventListener('mousemove', moveHandler);
document.addEventListener('mouseup', () => {
this.marginLeft = this.marginLeft + this.delta;
this.delta = 0;
this.contentEl.removeEventListener('mousemove', moveHandler);
// Переходить по ссылке, если delta = 0
});
});
Проблема в том, что при перетаскивании по ссылке срабатывает событие стандартного клика и каждый раз, когда курсор отпускается, пользователь переходит по ссылке. Мне бы хотелось, чтобы переход по ссылке пункта меню происходил только в том случае, если отсутствовало смещение меню.
Можно ли это реализовать, если событие 'click', похоже, видит состояние переменных до вызова 'mousedown'?
Единственное, что приходит в голову, это отменить обработчик по умолчанию для click, а уже в обработчике mousedown -> mouseup анализировать, было смещение или нет. И если дельта равна нулю, реанимировать переход по ссылке (видимо, через window.location.assign).