在代码中使用自己的handler响应客户端对象事件,会使用如下类似的方式:
// Simple global handler.
var b = new Custom.Button();
b.click.add(OnClickHandler);
function OnClickHandler() {
...
}
由于多种原因,这个设计在RTM版本中被改变了。例如为了改善性能,提供和.NET Framework相似的编程模型,遵循ECMAScript标准和基于用户反馈等等。在RTM版本中,您能简单地使用命名规则来定义事件,这和属性的定义有些相似,使用了“add_”和“remove_”方法。工具也能识别出这种命名方式,例如这样就能够在IntelliSense中得到事件的提示了。
在高级的组件中,你能简单地将事件handler加到内置的EventHandlerList对象中,该对象可以使用Compoennt基类的get_events()方法获得。和CTP版本不同的是,RTM版本只在添加事件handler的时候构造事件对象,而不是在构造对象实例时就初始化了所有的事件对象。下面的示例展示了在RTM版本中定义事件的模型:
Custom.Button.prototype = {
initialize: function() {
Custom.Button.callBaseMethod(this, 'initialize');
this._handler =
Function.createDelegate(this, this._onClickHandler);
$addHandler(this.get_element(), 'click', this._handler);
..
}
add_click: function(handler) {
this.get_events().addHandler('click', handler);
},
remove_click: function(handler) {
this.get_events().removeHandler('click', handler);
},
dispose: function() {
// Potential for dispose to be called more than once
if (this._handler) {
$removeHandler(this.get_element(), 'click', this._handler);
delete this._handler;
}
Custom.Button.callBaseMethod(this, 'dispose');
},
_onClickHandler: function() {
var ev = this.get_events().getHandler(this._handler);
if (ev) {
ev (this, Sys.EventArgs.Empty);
}
}
}
Comment 似乎Microsoft ASP.NET AJAX的确在性能和编程模型上作了很大努力,这从事件模型的改变上就能看出来。可以发现,“EventHanderList”对象的使用,与.NET Framework里为一个类定义大量事件时所用的Practice如出一辙。
这个设计使得对象在需要时才会创建事件对象,它使用了一个新的类“DomEvent”的静态方法来添加或删除绑定在DOM元素上的事件,这是一个标准模型。在这个模型之下,一组抽象的API会提供对于浏览器兼容的支持。
如果需要将自己的handler绑定到事件上,您现在可以使用类似于下面的代码。参数sender是可选的,它能让你获得有关事件的更多信息,例如您可以确定是哪个Button被点击了。
var b = new Custom.Button();
b.add_click(OnClickHandler);
function OnClickHandler(sender, args) {
..
}