jQuery пользовательская последовательность событий
-
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);
Замените нажмите на пользовательское имя события :)