У меня была такая же проблема, и я тоже не нашел решения. Но я придумал хак, который, кажется, работает.
Поскольку обработчик onMouseUp, по-видимому, не может отменить щелчок по ссылке с помощью preventDefault или 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);
}
}
Надеюсь, это дало вам представление о том, как этого можно добиться. Как я уже сказал, это не полное решение, а просто объяснение концепции.
person
Fredrik Boström
schedule
19.01.2012