2010-06-22 2 views
4

Я знаю, как связать несколько событий и все такое. Я хочу сделать несколько событий, чтобы вызвать функцию.jQuery Несколько событий

Как

$ (это) .click и $ (это) .mousemove запускает функцию

Есть ли способ сделать это? Возможно ли это, или я просто мечтаю.

+0

Я бы, вероятно, сохранил массив со всеми «действиями триггера» в нем и обновил до «истины», если это было сделано, если все они были запущены (проверьте действие, которое вы хотите), затем выполните то, что вы когда-либо делали пытаясь сделать. –

+0

Можете ли вы уточнить, что вы пытаетесь выполнить, используя комбинацию? вы хотите справиться с перетаскиванием, не так ли? – vittore

+0

Предлагаю внимательный дизайн пользовательского интерфейса. Несколько событий последовательного действия - например, «перетаскивание» - уже хорошо определены и хорошо реализованы как отдельные события. Но когда вы пытаетесь опрокинуть свои собственные, это может быть сложнее, чем кажется. Предположим, что вы хотите, чтобы A выполнял «x», «B», чтобы сделать «y», а AB - «z». Вы получаете только A ... и затем несколько секунд ничего. Это просто очень медленный пользователь, который в конце концов также будет сигнализировать B и получить действие «z», или пользователь хочет немедленно выполнить действие «x» и раздражен задержкой? Получение времени задержки «в самый раз» может быть довольно сложной проблемой. –

ответ

3

С лучшим пониманием сейчас, одна вещи, которую вы могли бы сделать, это одно событие bind и unbind другой:

Пример:http://jsfiddle.net/ZMeUv/

$(myselector).mousedown(function() { 
    $(document).mousemove(function() { 
     // do something 
    }); 

    $(document).mouseup(function() { 
     $(this).unbind(); // unbind events from document 
    }); 
}); 

Это предотвращает mousemove от постоянной стрельбы, когда вас не нуждаются в этом.

+2

Нет, вы, ребята, думаете, что я хочу связать несколько событий с одной и той же функцией. То, что я хочу сделать, это ТРЕБУЕТСЯ определенные события. Например, если вы хотите, чтобы элемент спрятался, пользователю пришлось бы вызывать Click() и MouseMove(). Кроме того, $ (это) является просто общим селектором. Это ничего не значит ... просто наполнителя. –

+0

@user - Есть способы сделать это. Я поменяю свой ответ одной мыслью. – user113716

2

Попробуйте что-нибудь вроде этого?

var isDown = false; 

$(sel).mousedown(function() { 
    isDown = true; 
}); 

$(sel).mouseup(function() { 
    isDown = false; 
}); 

$(sel).mousemove(function() { 
    if (isDown) { 
     // Mouse is clicked and is moving. 
    } 
}); 
+1

Вероятно, вы должны изменить «mouseup» для работы с «документом». Таким образом, если пользователь делает «mousedown» на селекторе, отключает мышь, а затем мышь вверх, переменная 'isDown' останется« истина ». – user113716

0

Если я правильно прочитал ваш вопрос, вы просите о необходимости сочетания нескольких событий для запуска одной функции. Этого можно добиться, но я думаю, что это будет зависеть от конкретных событий и логики или нелогичности их сочетания. Например, mousemove событие:

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

Сравните это с событием mousedown, которое есть - ну, один за клик. Как объединить? JQuery API, переходит к государству:

общий шаблон, чтобы связать mousemove обработчик изнутри mousedown левши [так] и отвязать его из соответствующего mouseup обработчика. Если вы выполняете эту последовательность событий , помните, что событие может быть отправлено на другой HTML-код , чем событие mousemove, которое было . Чтобы учесть это, обработчик обычно должен быть связан с элементом высокого уровня в дереве DOM, , таким как <body>.

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

Ссылки: jQuery API: mousemove()

3

Вы можете использовать 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); 
    } 
}; 
0

Хорошо, спасибо за вашу идею Патрик. Это напомнило мне, как я сделал что-то подобное на Java.

var m_down = false; $ (это) .mousedown (функция() {

m_down = true; 

});

$ (это) .mouseup (функция() {

m_down = false; 

});

$ (это) .mousemove (функция() {

// Code to occur here 

});

Смежные вопросы