Вы можете использовать специальные события jQuery , чтобы упорядочить все и оптимизировать вещи в процессе. Комбинация mousedown и mousemove также обычно называется «drag», так что вот пример создания события перетаскивания, которое вы можете привязать к элементам. Обратите внимание, что этот код относится к jQuery 1.4.2
Одним из преимуществ использования этого является то, что вы связываете обработчики mousemove
, mouseout
и mousedown
только один раз для каждого элемента, независимо от того, сколько раз этот элемент связан с событием drag
. Теперь это не самый оптимальный способ сделать это, и вы можете установить только 3 обработчика для документа и управлять всем с ним, что одинаково легко сделать с помощью API специальных событий. Он просто обеспечивает красиво упакованный способ построения сложных взаимодействий, который был бы возможен только с помощью собственных событий или пользовательских событий в смысле jQuery.
$("..").bind("drag", function() {
...
});
Я постараюсь добавить больше документации о том, что на самом деле происходит, так как это выглядит довольно не интуитивно, я должен признаться. Оформить еще одну приятную статью на тему.
См. Пример этого здесь . Чтобы создать это специальное событие, используйте:
jQuery.event.special.drag = {
// invoked each time we bind drag to an element
add: function(obj) {
var originalHandler = obj.handler;
obj.handler = function(event) {
var el = jQuery(this);
if(el.data('mousePressed')) {
return originalHandler.apply(this, arguments);
}
};
},
// invoked only the first time drag is bound per element
setup: function(data, namespaces) {
var el = jQuery(this);
el.data('mousePressed', false);
el.bind('mousedown', function() {
jQuery(this).data('mousePressed', true);
});
jQuery(document).bind('mouseup', function() {
el.data('mousePressed', false);
});
el.bind('mousemove', jQuery.event.special.drag.handler);
},
// invoked when all drag events are removed from element
teardown: function(namespaces) {
var el = jQuery(this);
jQuery.removeData(this, 'mousePressed');
el.unbind('mousedown');
el.unbind('mouseup');
},
// our wrapper event is bound to "mousemove" and not "bind"
// change event type, so all attached drag handlers are fired
handler: function(event) {
event.type = 'drag';
jQuery.event.handle.apply(this, arguments);
}
};