文本和注释节点直接返回。 代码如下: if ( handler === false ) { handler = returnFalse; } else if ( !handler ) { // Fixes bug #7229. Fix recommended by jdalton return; }
参数handler为false时,将handler赋值为returnFalse,returnFalse为一个函数,如下 代码如下: function returnFalse() { return false; }
jQuery通过handler为false来阻止元素默认行为,停止事件冒泡。这个需要结合jQuery.event.handle看。 代码如下: var handleObjIn, handleObj; if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; } // Make sure that the function being executed has a unique ID if ( !handler.guid ) { handler.guid = jQuery.guid++; }
这时会把handleObjIn赋值为所传的JS对象,真正的handler 却是handleObjIn.handler。这话有点绕,慢慢体会。 代码如下: // Make sure that the function being executed has a unique ID if ( !handler.guid ) { handler.guid = jQuery.guid++; }
所传参数handler添加个属性guid,为一个数字,自增的从1开始。即使用jQuery添加事件,会为事件响应函数默认的添加了属性guid。这个guid再删除事件时会用到。 代码如下: // Init the element's event structure var elemData = jQuery._data( elem );
先取elemData,这里使用了前面提到的jQuery._data。第一次为HTMLElement添加事件是elemData是个空对象({})。 代码如下: // If no elemData is found then we must be trying to bind to one of the // banned noData elements if ( !elemData ) { return; }
elemData不存在则直接返回。 代码如下: var events = elemData.events, eventHandle = elemData.handle;
定义events,eventHandle。同样第一次时这两个变量都是undefined。 代码如下: if ( !events ) { elemData.events = events = {}; } if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.handle.apply( eventHandle.elem, arguments ) : undefined; }; }
给elemData.events和elemData.handle赋值。 代码如下: // Add elem as a property of the handle function // This is to prevent a memory leak with non-native events in IE. eventHandle.elem = elem;
暂存elem到eventHandle,删除事件注册时会将其置null,避免部分浏览器中内存泄露。 代码如下: // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = types.split(" ");