У меня была такая же проблема, и я тоже не нашел решения.Но я придумал хак, который, кажется, работает.
Поскольку обработчик onMouseUp, по-видимому, не может отменить щелчок по ссылке с помощью protectDefault или stopEvent или чего-либо еще, нам нужно сделать так, чтобы ссылка отменялась сама.Это можно сделать, написав атрибут onclick, который возвращает false для тега a, когда начинается перетаскивание, и удаляя его, когда перетаскивание заканчивается.
И поскольку обработчики onDragEnd или onMouseUp запускаются до того, как браузер интерпретирует щелчок, нам нужно проверить, где заканчивается перетаскивание, какая ссылка нажата и так далее.Если он заканчивается за пределами перетаскиваемой ссылки (мы перетащили ссылку, чтобы курсор больше не находился на ссылке), мы удаляем обработчик onclick в onDragEnd;но если он заканчивается там, где курсор находится на перетаскиваемой ссылке (щелчок будет инициирован), мы позволяем обработчику onclick удалить себя.Достаточно сложно, верно?
НЕ ПОЛНЫЙ КОД, но просто чтобы показать вам идею:
// event handler that runs when the drag is initiated
function onDragStart (args) {
// get the dragged element
// do some checking if it's a link etc
// store it in global var or smth
// write the onclick handler to link element
linkElement.writeAttribute('onclick', 'removeClickHandler(this); return false;');
}
// run from the onclick handler in the a-tag when the onMouseUp occurs on the link
function removeClickHandler (element) {
// remove click handler from self
element.writeAttribute('onclick', null);
}
// event handler that runs when the drag ends
function onDragEnds (args) {
// get the target element
// check that it's not the a-tag which we're dragging,
// since we want the onclick handler to take care of that case
if (targetElement !== linkElement) {
// remove the onclick handler
linkElement.writeAttribute('onclick', null);
}
}
Я надеюсь, что это даст вам представление о том, как этого можно достичь.Как я уже сказал, это не полное решение, просто объяснение концепции.