Событие mouseUp при перетаскивании

У меня есть ссылка, которая имеет обработчики mousedown и mouseup для анимации некоторых объектов на странице. При перетаскивании (перетаскивание) ссылка запускает событие mousedown, но при выпуске не срабатывает mouseup. есть ли обходной путь для этой проблемы?

Вот пример, если вы нажмете ссылку, как правило, она работает, но при перетаскивании мышью ссылки не происходит:

http://jsfiddle.net/hL3mg/1/

Ответ 1

Обработка перетаскивания

Что-то важное, о котором никто не упоминает, состоит в том, что на самом деле есть событие, чтобы зарегистрировать конец перетаскивания, что, как объясняют другие ответы, - это то, что происходит здесь. Событие называется dragend, поэтому вы можете просто сделать

$("a").on("dragend",function(){
    console.log("Drag End");
});

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

Регистрация мыши

Однако существует возможность зарегистрировать запрошенные мышки, просто отмените поведение перетаскивания на return ing false в прослушивателе событий click, а затем зарегистрируйте mouseup на document.

$("a").mousedown(function(){
    console.log("Mouse Down");
    return false;
});

$(document).mouseup(function(){
    console.log("Mouse Up");
});

Единственное замечание, которое я чувствую, что я должен сделать, это то, что в одиночном jsfiddle это сработало отлично, в моем собственном коде это не так, поэтому я слушаю как mouseup, так и dragend только чтобы быть уверенным.

Ответ 2

Кажется, что событие mouseup не будет запущено, потому что ваша мышь оставила ссылку, когда вы отпустите левую кнопку.
Из http://www.quirksmode.org/js/events_mouse.html:

Предположим, что пользователь нажал кнопку мыши кнопку по ссылке, затем перемещает указатель мыши отключите связь, а затем отпустите кнопка мыши. Теперь ссылка только регистрирует событие mousedown.


Может быть, вы можете сделать это до walkaround:

  • зарегистрировать событие mousedown для ссылки
  • зарегистрировать событие mouseup для всего документа
  • когда событие fire fire mousedown, а затем событие пожара документа mouseup, вы можете подумать, что ссылка запускает mouseup event

Ответ 3

Что я сделал, чтобы решить это, связать событие mouseOut с каждой ссылкой и проверить, была ли нажата какая-либо ссылка. Если бы это было так, mouseOut зафиксировал бы позиционирование ссылки. Здесь код:

var mouse_button = false;
$('a')
.mousedown(function(){
    $(this).css('top', '+=2');
    mouse_button = true;

})
.mouseup(function(){
    $(this).css('top', '-=2');
    mouse_button = false;
})
.mouseout(function(){
    if (mouse_button) {
        $(this).css('top', '-=2');
        mouse_button = false;
    }
});

Ответ 4

То, что вы описали, - это сознательный дизайн.

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

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

Это соображение дизайна пользовательского интерфейса. Вот почему вы должны программировать так, чтобы щелкнуть мышью, чтобы инициировать практически любое действие, а не только мышь вниз.

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

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

Ссылки предназначены именно для этого: ссылка на что-то. Да, вы можете скопировать код JavaScript, который будет выполняться при нажатии ссылки - href= "javascript: someFunction();" или вы можете сделать код onclick, чтобы выполнить что-то или даже мышь вверх. Однако ссылка предназначена для того, чтобы что-то не тащилось.

Используйте разделение или диапазон и передвиньте его.

Боб

Ответ 5

Если вы внимательно посмотрите на то, что делает браузер, он "перетаскивает" объект DOM, в моем случае ссылку, после выпуска событие mouseup не срабатывает для объекта DOM (под мышью при перетаскивании) или документ (он, кажется, не пузырится).

добавление draggable="false" attr помогает...

<a href="#" draggable="false">link</a>

однако все еще есть проблема, когда пользователь выделяет/выбирает что-то своим курсором и перетаскивает выбранные элементы.

Использование события mouseout также помогает.

Ответ 6

Если вам нужно обрабатывать перетаскивание в jQuery, почему бы не использовать Draggable?