0

カスタムJSオブジェクトを作成しています。このオブジェクトはいくつかを実行しますactionaction実行され、すでに実行されているオブジェクトを(カスタムイベントをトリガーすることによって action)コンシューマーに通知できるようにしたい。onBeforeAction(この動作モデルは、コントロールにイベントがあるASP.NETで知られていonAfterActionます)。
トリッキーな部分は、コンシューマーがイベントシーケンスを停止/中断できるようにすることです。

望ましい動作のアルゴリズム(Human#)は次のとおりです。

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

私のオブジェクトにこの機能があると、コンシューマーは次のようなことを行うことができます。

$(myIntance).bind('onBeforeAction'、function(){
  if(!someCondition.satisfied)
    falseを返します。
  trueを返します。
});
$(myIntance).bind('onAfterAction'、function(){
  //ここでアクションに応答します
});

「制御可能な」イベントシーケンスを実装する方法についてのアイデアは素晴らしいでしょう。
前もって感謝します。
// R

4

2 に答える 2

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

クリックをカスタムイベント名に置き換えます:)

于 2011-03-14T16:00:49.280 に答える
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);
    });

私はこれをFireFoxとFirebugで実行しました(もちろん)。carUnderControl.goFaster();Firebugのコンソールから3回実行 すると、現在の速度:...メッセージが3回表示されました。その後のgoFaster()メソッドの実行で、速度の向上がメッセージを阻止したことが示されました。

それが私が実現したかった機能です。
これを改善するための推奨事項は大歓迎です。

ありがとう

于 2011-03-14T20:52:15.693 に答える