Вы можете использовать JQuery-х special events, чтобы упаковать все красиво и оптимизировать вещи в этом процессе.Комбинация mousedown и mousemove также обычно называется именем «drag», поэтому здесь приведен пример создания события перетаскивания, которое вы можете привязать к элементам. Обратите внимание, что этот код является специфическим для JQuery 1.4.2
Одним из преимуществ использования этого является то, что вы только не связывать mousemove
, mouseout
и mousedown
обработчики один раз каждый элемент, независимо от того, сколько раз этот элемент связанных с событием drag
. Теперь это не самый оптимальный способ сделать это, и вы можете настроить только 3 обработчика документа и управлять им всем, что в равной степени легко связано с API специальных событий. Он просто обеспечивает хорошо упакованный способ создания сложных взаимодействий, чем это возможно с помощью только собственных событий или пользовательских событий в смысле jQuery.
$("..").bind("drag", function() {
...
});
Я попытаюсь добавить больше документации о том, что происходит на самом деле, как это выглядит довольно неинтуитивными, я должен признаться. Оформить заказ еще один хороший article по этой теме.
См. Пример этого here. Чтобы создать это специальное мероприятие, используйте:
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);
}
};
Я бы, вероятно, сохранил массив со всеми «действиями триггера» в нем и обновил до «истины», если это было сделано, если все они были запущены (проверьте действие, которое вы хотите), затем выполните то, что вы когда-либо делали пытаясь сделать. –
Можете ли вы уточнить, что вы пытаетесь выполнить, используя комбинацию? вы хотите справиться с перетаскиванием, не так ли? – vittore
Предлагаю внимательный дизайн пользовательского интерфейса. Несколько событий последовательного действия - например, «перетаскивание» - уже хорошо определены и хорошо реализованы как отдельные события. Но когда вы пытаетесь опрокинуть свои собственные, это может быть сложнее, чем кажется. Предположим, что вы хотите, чтобы A выполнял «x», «B», чтобы сделать «y», а AB - «z». Вы получаете только A ... и затем несколько секунд ничего. Это просто очень медленный пользователь, который в конце концов также будет сигнализировать B и получить действие «z», или пользователь хочет немедленно выполнить действие «x» и раздражен задержкой? Получение времени задержки «в самый раз» может быть довольно сложной проблемой. –