jquery перетаскиваемый и наводимый мышью

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

Я реализовал это следующим образом (упрощенно):

$('#some_id').draggable({ helper: 'clone', opacity: 0.35, zIndex: 20000, cursor: 'move' });
$('#some_menu').live('mouseenter click', function(){jThis.find('div').addClass('opened');});

person aepheus    schedule 30.06.2011    source источник
comment
Можем ли мы увидеть код того, что вы пробовали до сих пор?   -  person Abe Miessler    schedule 01.07.2011
comment
Да, попробуйте с $('p738')[*2] *11 (function(){ +=39% acc rate});   -  person Roko C. Buljan    schedule 01.07.2011
comment
возможно, попробуйте event.stopPropagation() внутри событий mouseenter и click   -  person ryuutatsuo    schedule 01.07.2011
comment
@ryuutatsuo Я хочу разрешить ему поведение мыши, а не предотвращать его. Я хочу, чтобы он выполнял как перетаскивание, так и наведение мыши, он только перетаскивает.   -  person aepheus    schedule 01.07.2011


Ответы (5)


Я только что узнал, что это очень логичная проблема. Как только вы начнете перетаскивать элемент, он останется под указателем мыши. Следовательно, он будет просто зависать над текущим элементом все время!!

Исправление (не очень красивое) состоит в том, чтобы установить параметр cursorAt, чтобы указатель мыши находился за пределами перетаскиваемого элемента:

$('#some_id').draggable({
      cursorAt: {left: -10, top: -10}
});

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

Надеюсь, что это помогает немного!

person Marcel Paans    schedule 04.09.2011
comment
Спасибо! после долгих поисков это исправило мою проблему. - person user547794; 06.01.2013

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

Решение состоит в том, чтобы установить свойство CSS pointer-events на none вспомогательного элемента. Это позволит событиям указателя срабатывать на элементах под помощником.

Вы можете сделать это легко, предоставив вспомогательной опции обратный вызов для создания вспомогательного элемента:

$('#some_id').draggable({
    helper: function() {
        return $(this).clone().css("pointer-events","none").appendTo("body").show();
    }
});
person Yonatan Naor    schedule 29.04.2013
comment
$(this) относится к родительскому контейнеру (ul). Чтобы получить отдельный элемент (li), используйте параметр ui, который принимает вспомогательная функция: helper: function (event, ui) { return ui.clone().css(pointer-events, none).appendTo(.container). показывать(); } - person Antony; 24.03.2014
comment
Вы, сэр, герой! Спасибо! - person stack reader; 23.06.2017

Этого можно добиться, используя «over:» и «out:», где определен ваш droppable.

$(".droppable").droppable({
    accept: '.draggable',
    over: function(event, ui) {
       $(this).addClass('temporaryhighlight');
    },
    out: function(event, ui) {
       $(this).removeClass('temporaryhighlight');
    },    
    drop: function() {
        //do some stuff
    }
});

В вашем сценарии, однако, вам придется сделать ваши меню выпадающими, что, как я предполагаю, не совсем то, что вам нужно (я предполагаю, что вы пытаетесь перейти к чему-то, что находится в меню, а не ко всему раскрывающемуся списку ). Возможно, просто ничего не делать или вернуться к функции drop: для этих предметов..?

Кредиты и дополнительная информация:

http://forum.jquery.com/topic/draggable-highlighting-custom-div-on-droppable-hover

http://jsfiddle.net/nickadeemus2002/wWbUF/1/

person frax    schedule 25.07.2012

Вы можете написать обработчик события перетаскивания для вашего перетаскиваемого объекта, который проверяет, находится ли курсор над элементом, для которого вы хотите обработать событие наведения мыши. Вам нужно будет определить наведение мыши самостоятельно, используя методы jQuery offset(), width() и height() для статического элемента и либо позицию курсора из объекта события для события перетаскивания, либо собственный ui.offset пользовательского интерфейса jQuery, в зависимости от того, что лучше подходит для вашей цели. .

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

person Miloš Rašić    schedule 14.03.2012

Основываясь на том, что опубликовал Йонатан:

Ваш JS:

$('#some_id').draggable({
  helper: 'clone',
  opacity: 0.35,
  zIndex: 20000,
  cursor: 'move' 
});

Просто добавьте это в свой CSS:

#some_id.ui-draggable-dragging { 
  pointer-events: none; 
}

немного чище.

person Edan Canning    schedule 28.06.2017