Ext.on,其实就是Ext.lib.Event里的addListener方法,把addListener的代码拿出来晒晒先,大致过一遍,我下面一步步解释
- Ext.lib.Event = function() {
- var listeners = [];//用来保存许多监听器的数组,每一行包含这4个:el, eventName, fn, wrappedFn,wrappedFn指的是将fn进行一个封装
- addListener: function(el, eventName, fn) {
- el = Ext.getDom(el);
- if (!el || !fn) {
- return false;
- }
- if ("unload" == eventName) {
- unloadListeners[unloadListeners.length] =
- [el, eventName, fn];
- return true;
- }
- // prevent unload errors with simple check
- var wrappedFn = function(e) {
- return typeof Ext != 'undefined' ? fn(Ext.lib.Event.getEvent(e)) : false;
- };
- var li = [el, eventName, fn, wrappedFn];
- var index = listeners.length;
- listeners[index] = li;//将这4个东东保存进数组
- this.doAdd(el, eventName, wrappedFn, false);
- //这里的doAdd是一个单例模式,this.doAdd其实返回一个函数引用,将这4个值传进那个函数里,那个函数是什么?那个函数就是正真绑定事件的函数!!往下看》》
- return true;
- },
- doAdd: function () {
- if (window.addEventListener) {
- return function(el, eventName, fn, capture) {
- el.addEventListener(eventName, fn, (capture));
- };//那个函数在这里,这是FF的
- } else if (window.attachEvent) {
- return function(el, eventName, fn, capture) {
- el.attachEvent("on" + eventName, fn);
- };//那个函数在这里,这是IE的
- } else {
- return function() {
- };
- }
- }()
- }
- }();
再注意下 this.doAdd(el, eventName, wrappedFn, false);传进去的是一个wrappedFn,而不是用户指定的fn,为什么要这样呢?我们来看它的定义:
var wrappedFn = function(e) {
return typeof Ext != ‘undefined’ ? fn(Ext.lib.Event.getEvent(e)) : false;
};
其实它是返回了一个 fn(Ext.lib.Event.getEvent(e)) ,看看Ext.lib.Event.getEvent(e)的源码
- getEvent: function(e) {
- var ev = e || window.event;
- if (!ev) {
- var c = this.getEvent.caller;
- while (c) {
- ev = c.arguments[0];
- if (ev && Event == ev.constructor) {
- break;
- }
- c = c.caller;
- }
- }//上面在干嘛?其实也是为了兼容浏览器,确保事件e能够被取到!
- return ev;
- },
总结下addListener做了哪些事情:
1、确保事件e被取到
2、将一些信息存进listeners数组
3、确保将事件绑定到element

有个地方看不懂:
doAdd方法返回的是个函数,在这个函数里 el.attachEvent(”on” + eventName, fn);
可是这个函数并没有执行啊,这样el并没有绑定上事件啊?是不是我漏了什么地方啊?
你的确漏看一个地方
this.doAdd(el, eventName, wrappedFn, false);
这个doAdd不仅仅返回一个函数的引用,而且它还执行了这个函数。
doAdd : function(){
return : function(){};
};
这个写法是返回函数引用,就是你指的“没有执行呀”,的确没有执行,但是你再仔细看看,上面的写法其实是,
doAdd : function(){
return : function(){};
}();
明白了吧?
呵呵,谢谢指点。明白了。刚接触javascript oo编程,还要多学习,在你的blog里面学到不少东西,非常感谢。
不明白ext的getEvent做这么多工作~~平常我们要得到event就是var ev = arguments[0] || window.event; 呵呵~~~