X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=cec2845a17cedfb3b6aa8bbb3ade1d76988b960e;hb=dcf0fa5048ef2379d551f29ffa29b14ec5ee09d5;hp=d91231e8683ee99d7d1e042a04f98c5473f6a963;hpb=da966573c3f3cb083c48cd3ead88e7542937d4df;p=jquery.git diff --git a/src/event.js b/src/event.js index d91231e..cec2845 100644 --- a/src/event.js +++ b/src/event.js @@ -25,6 +25,10 @@ jQuery.event = { elem = window; } + if ( handler === false ) { + handler = returnFalse; + } + var handleObjIn, handleObj; if ( handler.handler ) { @@ -47,7 +51,7 @@ jQuery.event = { } var events = elemData.events = elemData.events || {}, - eventHandle = elemData.handle, eventHandle; + eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function() { @@ -138,7 +142,11 @@ jQuery.event = { return; } - var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, elemData = jQuery.data( elem ), events = elemData && elemData.events; @@ -179,7 +187,7 @@ jQuery.event = { type = namespaces.shift(); namespace = new RegExp("(^|\\.)" + - jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)") + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); } eventType = events[ type ]; @@ -189,7 +197,7 @@ jQuery.event = { } if ( !handler ) { - for ( var j = 0; j < eventType.length; j++ ) { + for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( all || namespace.test( handleObj.namespace ) ) { @@ -203,7 +211,7 @@ jQuery.event = { special = jQuery.event.special[ type ] || {}; - for ( var j = pos || 0; j < eventType.length; j++ ) { + for ( j = pos || 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( handler.guid === handleObj.guid ) { @@ -321,7 +329,7 @@ jQuery.event = { } // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (e) {} + } catch (inlineError) {} if ( !event.isPropagationStopped() && parent ) { jQuery.event.trigger( event, data, parent, true ); @@ -348,7 +356,7 @@ jQuery.event = { } // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (e) {} + } catch (triggerError) {} if ( old ) { target[ "on" + type ] = old; @@ -360,9 +368,9 @@ jQuery.event = { }, handle: function( event ) { - var all, handlers, namespaces, namespace, events; + var all, handlers, namespaces, namespace, events, args = jQuery.makeArray( arguments ); - event = arguments[0] = jQuery.event.fix( event || window.event ); + event = args[0] = jQuery.event.fix( event || window.event ); event.currentTarget = this; // Namespaced event handlers @@ -374,7 +382,8 @@ jQuery.event = { namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); } - var events = jQuery.data(this, "events"), handlers = events[ event.type ]; + events = jQuery.data(this, "events"); + handlers = (events || {})[ event.type ]; if ( events && handlers ) { // Clone the handlers to prevent manipulation @@ -391,7 +400,7 @@ jQuery.event = { event.data = handleObj.data; event.handleObj = handleObj; - var ret = handleObj.handler.apply( this, arguments ); + var ret = handleObj.handler.apply( this, args ); if ( ret !== undefined ) { event.result = ret; @@ -511,9 +520,8 @@ jQuery.event = { if ( this.setInterval ) { this.onbeforeunload = eventHandle; } - - return false; }, + teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; @@ -525,10 +533,14 @@ jQuery.event = { var removeEvent = document.removeEventListener ? function( elem, type, handle ) { - elem.removeEventListener( type, handle, false ); + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } } : function( elem, type, handle ) { - elem.detachEvent( "on" + type, handle ); + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } }; jQuery.Event = function( src ) { @@ -826,7 +838,7 @@ jQuery.each(["bind", "one"], function( i, name ) { return this; } - if ( jQuery.isFunction( data ) ) { + if ( jQuery.isFunction( data ) || data === false ) { fn = data; data = undefined; } @@ -968,10 +980,10 @@ jQuery.each(["live", "die"], function( i, name ) { if ( name === "live" ) { // bind live handler - context.each(function(){ - jQuery.event.add( this, liveConvert( type, selector ), + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], liveConvert( type, selector ), { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); - }); + } } else { // unbind live handler @@ -980,12 +992,12 @@ jQuery.each(["live", "die"], function( i, name ) { } return this; - } + }; }); function liveHandler( event ) { - var stop, elems = [], selectors = [], args = arguments, - related, match, handleObj, elem, j, i, l, data, + var stop, maxLevel, elems = [], selectors = [], + related, match, handleObj, elem, j, i, l, data, close, events = jQuery.data( this, "events" ); // Make sure we avoid non-left-click bubbling in Firefox (#3861) @@ -1011,20 +1023,23 @@ function liveHandler( event ) { match = jQuery( event.target ).closest( selectors, event.currentTarget ); for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + for ( j = 0; j < live.length; j++ ) { handleObj = live[j]; - if ( match[i].selector === handleObj.selector ) { - elem = match[i].elem; + if ( close.selector === handleObj.selector ) { + elem = close.elem; related = null; // Those two events require additional checking if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; } if ( !related || related !== elem ) { - elems.push({ elem: elem, handleObj: handleObj }); + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); } } } @@ -1032,13 +1047,23 @@ function liveHandler( event ) { for ( i = 0, l = elems.length; i < l; i++ ) { match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + event.currentTarget = match.elem; event.data = match.handleObj.data; event.handleObj = match.handleObj; - if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) { - stop = false; - break; + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } } } @@ -1054,8 +1079,15 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl "change select submit keydown keypress keyup error").split(" "), function( i, name ) { // Handle event binding - jQuery.fn[ name ] = function( fn ) { - return fn ? this.bind( name, fn ) : this.trigger( name ); + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); }; if ( jQuery.attrFn ) {