Пользовательская последовательность событий jQuery - PullRequest
0 голосов
/ 14 марта 2011

Я создаю собственный объект JS. Этот объект выполняет некоторые action. Я хочу иметь возможность уведомить потребителя объекта (путем запуска пользовательских событий), что action будет выполнено и action уже выполнено. (Эта модель поведения известна в ASP.NET, где элементы управления имеют события onBeforeAction и onAfterAction).
Сложность в том, что я бы хотел, чтобы потребитель мог остановить / прервать последовательность событий.

Вот алгоритм (в Human #) желаемого поведения:

this.trigger('onBeforeAction');
if (!onBeforeAction.wasCanceled){
  this.doAction();
  this.trigger('onAfterAction');
}

Наличие этой функции в моем объекте позволило бы потребителю сделать что-то вроде этого:

$(myIntance).bind('onBeforeAction', function(){
  if (!someCondition.satisfied)
    return false;
  return true;
});
$(myIntance).bind('onAfterAction', function(){
  // respond to action here
});

Любые идеи о том, как реализовать «управляемую» последовательность событий, были бы великолепны.
Заранее спасибо.
// R

Ответы [ 2 ]

0 голосов
/ 14 марта 2011

Наверное, я нашел решение.
Вот что я придумал:

// my object
function Car(){
    this.currentSpeed = 0;
}

Car.prototype.goFaster = function(){
    var event = $.Event('beforeSpeedIncrease'); 
    $(this).trigger(event); // notify "onBeforeAction"
    if (!event.isDefaultPrevented()){
        this.currentSpeed += 10; // actual action
        $(this).trigger('afterSpeedIncreased'); // notify "onAfterAction"
    }
}

Тогда какой-то потребитель может действовать так:

var speedLimit = 30;

var carUnderControl = new Car();

$(carUnderControl)
    .bind('beforeSpeedIncrease', function(e){
        if (carUnderControl.currentSpeed >= speedLimit){
            e.preventDefault();
            console.log('Speed increase prevented, current speed: ' + carUnderControl.currentSpeed);
        }
    })
    .bind('afterSpeedIncreased', function(){
        console.log('Current speed: ' + carUnderControl.currentSpeed);
    });

Я запустил это в FireFox с Firebug (конечно). Выполнение carUnderControl.goFaster(); с консоли Firebug три раза показывало Текущая скорость: ... сообщение три раза. Последующие выполнения метода goFaster() показали Увеличение скорости не позволило сообщение.

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

Спасибо

0 голосов
/ 14 марта 2011
(function ($) {
  var origin = $.fn.click;
  $.fn.click = function(event) {
    //before function 
     origin.call(this, event);
     //after function 
     // remember to use return as this could help with jq chainability 
  };
})(jQuery);

Замените клик на свое имя события:)

...