jQuery пользовательская последовательность событий

StackOverflow https://stackoverflow.com/questions/5300934

  •  22-10-2019
  •  | 
  •  

Вопрос

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

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

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
});

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

Это было полезно?

Решение 2

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

// 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() Метод показан Увеличение скорости предотвращено сообщение.

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

Спасибо

Другие советы

(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);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top