0

我正在创建一个自定义 JS 对象。这个对象执行一些action. 我希望能够通知消费者action将要执行并且 action已经执行的对象(通过触发自定义事件)。(这种行为模型在控件具有onBeforeActiononAfterAction事件的 ASP.NET 中是已知的)。
棘手的部分是我希望消费者能够停止/中断事件序列。

这是所需行为的算法(在 Human# 中):

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

在我的对象中拥有此功能将允许消费者执行以下操作:

$(myIntance).bind('onBeforeAction', function(){
  if (!someCondition.satisfied)
    返回假;
  返回真;
});
$(myIntance).bind('onAfterAction', function(){
  // 在这里响应动作
});

关于如何实现“可控”事件序列的任何想法都会很棒。
提前致谢。
// R

4

2 回答 2

0

我想我找到了解决方案。
这是我想出的:

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

我已经用 Firebug 在 FireFox 中运行了这个(当然)。carUnderControl.goFaster();从 Firebug 的控制台执行 3 次显示Current speed: ...消息 3 次。方法的后续执行goFaster()显示速度增加阻止消息。

这就是我想要实现的功能。
非常欢迎任何关于如何改进这一点的建议。

谢谢

于 2011-03-14T20:52:15.693 回答
0
(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);

用您的自定义事件名称替换 click :)

于 2011-03-14T16:00:49.280 回答