先看addListener也就是Ext里面的on方法
/* * 注册事件函数,返回是否注册成功 * el : String/HTMLElement 一个html元素或其id,事件处理器将会被指定到其上 * eventName : String 需要监听的事件类型 * handler : Function 事件调用的处理函数。此函数将会被传递以下参数: * *****evt : EventObject EventObject ,描述了事件。 *****t : Element Element ,它是事件的目标(target)。 注意:此项可能被用delegate选项过滤。 * ****o : Object 来自调用addListener时的选项对象。 * * 例子: * el.addListener('click', this.onClick, this, * { single: true, delay: 100, stopEvent : true, forumId: 4}) */ addListener : function( el , eventName , fn ) { /* ********************************************************* getDom : function( el ) { if ( !el || !document ) { return null; } return el.dom ? el.dom : ( typeof el == 'string' ? document.getElementById( el ) : el ); } ********************************************************* */ el = Ext.getDom( el ); // 参数检查 if ( !el || !fn ) { return false; } // 如果是unload事件,那么直接添加在unloadListeners数组中, //当window的onunload事件触发时执行 if ( "unload" == eventName ) { unloadListeners[unloadListeners.length] = [ el , eventName , fn ]; return true; } // 封装函数,处理event变量不兼容的问题 /* 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; } } return ev; } */ 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; // 下面语句就直接注册事件了 this.doAdd( el , eventName , wrappedFn , false ); return true; }