Javascript 如何动态注册jquery自定义事件?
我已经构建了一个dom对象引擎,其中包含私有/公共字段/方法,我已将其简化如下: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); } } 我想做的是构
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');
});