Javascript 如何动态注册jquery自定义事件?

Javascript 如何动态注册jquery自定义事件?,javascript,jquery,events,binding,triggers,Javascript,Jquery,Events,Binding,Triggers,我已经构建了一个dom对象引擎,其中包含私有/公共字段/方法,我已将其简化如下: function Engine(args){ this.display = args.display; this.getDisplay = function(){return this.display;} this.alertMsg = function(msg){ console.log(this.display); alert(msg); } } 我想做的是构

我已经构建了一个dom对象引擎,其中包含私有/公共字段/方法,我已将其简化如下:

function Engine(args){
   this.display = args.display;

   this.getDisplay = function(){return this.display;}
   this.alertMsg = function(msg){
      console.log(this.display);
      alert(msg);
   }
}
我想做的是构建一个自定义事件,该事件将在
警报(msg)
之后触发,例如
$(this.display).trigger(“afterAlert”)

现在,此事件可以是空的,也可以不是空的。以后声明的一个或多个对象如何注册到“afterAlert”事件?在我的例子中,其他javascript文件由主文件动态加载,可能包含以下代码:

function new_obj(){
    bind("afterAlert", function(){
       alert("alert was called");
    });
}

我想你要找的是观察者模式。至少我会这么做。下面的代码段使用不同的名称,但它基本上实现了您想要的功能(允许注册事件,甚至触发事件):

可观察={
addObserver:函数(observer){
如果(!this.uu observators)this.u observators=[];
这个.uu observators.push(observator);
},
addGlobalObserver:函数(观察者){
如果(!this.\u global\u observators)this.\u global\u observators=[];
这个。全局观察者。推(观察者);
},
removeObserver:函数(观察者){
var newObservators=[];
var公司;
while(co=this.\uu observators.pop()){
如果(co!=观察者)新建观察者。推送(co)
}
这是.\uu observators=newobservators;
新观察员=[];
while(co=this.\u global\u observators.pop()){
如果(co!=观察者)新建观察者。推送(co)
}
这是.\uuu global\u observators=newobservators;
},
通知:功能(事件){
var allobserver=this.\u global\u observators.concat(this.\u observators);
对于(var i=0;i
如果将此代码包含到类中,则可以使用
addObserver()
addGlobalObserver()
“类级别”事件)注册事件。在对象内部,使用
notify()
触发事件

代码取自。

请参阅我的答案……为了清晰起见,请重复

我将处理定制事件的注册、触发和解除绑定

jQuery拥有注册、绑定和解除绑定自定义事件所需的所有工具

下面是一个将两个div连接到名为customAjaxStart的自定义事件的示例。然后我可以触发这个函数,两个处理程序都将被调用

快速演示-启用firebug/ie8控制台

e、 g

以上面的例子为例,我将从全局ajaxStart触发customAjaxStart。任何监听器都会在xhr调用即将进行时自动触发(非常适合禁用小部件或显示加载的gif等),例如


我不能让它工作。。。在声明触发器后是否可以绑定?触发器是调用函数…这里是另一个演示,当我有第二个按钮连接新的订户元素并再次触发时。观察ff控制台
function new_obj(){
    bind("afterAlert", function(){
       alert("alert was called");
    });
}
    Observable = {
  addObserver: function(observer) {
    if (!this.__observers) this.__observers = [];
    this.__observers.push(observer);
  },
  addGlobalObserver: function(observer) {
    if (!this.__global_observers) this.__global_observers = [];
    this.__global_observers.push(observer);
  },
  removeObserver: function(observer) {
    var newObservers = [];
    var co;
    while (co = this.__observers.pop()) {
      if (co != observer) newObservers.push(co)
    }
    this.__observers = newObservers;
    newObservers = [];
    while (co = this.__global_observers.pop()) {
      if (co != observer) newObservers.push(co)
    }
    this.__global_observers = newObservers;
  },
  notify: function(event) {
    var allObservers = this.__global_observers.concat(this.__observers);
    for (var i=0; i < allObservers.length; i++) {
      var o = allObservers[i];
      if (o[event]) {
        var args = []
        for (var j=1; j < arguments.length; j++) {
          args.push(arguments[j])
        };
        o[event].apply(this, args);
      }
    };
  },
  __global_observers: [],
  __initializer: function() {
    this.__observers = [];
  }
};
$( function() {

  $('#div1').bind('customAjaxStart', function(){
    console.log('#div1 ajax start fired');
    $(this).fadeTo('slow', 0.3);
  });

  $('#div2').bind('customAjaxStart', function(){
    console.log('#div1 ajax start fired');
    $(this).fadeTo('slow', 0.3);
  });

  //fire the custom event
  $.event.trigger('customAjaxStart');

  //unbind div1 from custom event
  $('#div1').unbind('customAjaxStart');

  //again trigger custom event - div1 handler will not fire this time
 $.event.trigger('customAjaxStart'); 
});
$.ajaxStart( function(){

    $.event.trigger('customAjaxStart');

});