Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Конфликт onmousedown и onclick (https://javascript.ru/forum/events/64433-konflikt-onmousedown-i-onclick.html)

xbit 10.08.2016 20:23

Конфликт onmousedown и onclick
 
После того, как срабатывает onmousedown не выполняются события, связанные с onclick. Вот код - https://jsfiddle.net/webcodemaster/9xhLnjh0/. Зажимаете левую кнопку мыши, двигаете курсор - появляется выделяющий блок. Все норм. Но вот попробуйте кликнуть на ссылку - облом.

При этом, если закомментить в onmousedown событии строку div.hidden = 0; , то все будет работать прекрасно. Извивался и так и сяк - но если в функции события выполняется обращение к ДОМ, следующие события обламываются.

При этом всем событие onmouseup отрабатывает исправно. Не срабатывает только onclick, который вообще идет после onmouseup, но конфликтует именно с onmousedown.

В коде есть закомментированные участки с setTimeout(). С ними работает, но бывают глюки. А я хочу без глюков.

Что же делать, как же быть?

xbit 10.08.2016 20:52

Собственно, вопрос, почему именно не работает onclick также очень интересует. Коллеги, кто сталкивался, какие мысли.

warren buffet 10.08.2016 21:18

Когда блок оказывается над ссылкой, то клик идет через его маусдаун и не доходит до линка.

warren buffet 10.08.2016 21:26

Ключевой момент в дауне:

x1 = x2 = e.pageX;
y1 = y2 = e.pageY;

начальные и конечные координаты надо приводить к началу событий, тогда каждый раз рамка будет начинаться с них, а не хз откуда где она кончилась в прошлый раз и, поэтому, закрыть ссылку уже не получится.

Остальные мульки смотри в убдейте https://jsfiddle.net/9xhLnjh0/1/ )))

warren buffet 10.08.2016 21:46

С setTimeout там будет полный ппц. Даже при небольшом ауте, их запросто можно запустить несколько штук, а значит будет ингресс и хрен поймешь когда что натикает. Это значит нужна функция

function stop(h){clearTimeout(h);}

которую придется профтыкать перед всеми сетами

stop(someTime)
someTime=setTimeout(/* тряхомудия */);

геморрой в общем с этими задержками.

xbit 10.08.2016 21:47

Да, все так. Спасибо большое! Только не маусдаун, а маусап ) даун возвращает нормальный таргет.

warren buffet 10.08.2016 21:56

Цитата:

Сообщение от xbit
а маусап

Нельзя начать рисовать с поднятия пера. Все 4 координаты должны быть выставлены в начальную точку когда "перо" опущено. Это же плоттерная вся технология в мыше. Перо поднять, перенести на икс игрек, опустить, перенести на икс, игрек и так далее.

Ну и мув не должен ничего писать в координаты пока перо не опущено, то есть кнопка не нажата. Функции таскания элементов по странице так и работают - выставляют листенер на мув когда нажато и снимают когда отпущено, просто потому что нафиг не надо грузить комп бесполезными делами.


Часовой пояс GMT +3, время: 16:04.