X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=ac45e7e16568fdbaf886559064ad19b463ca1740;hb=86bbf9cf87784cdd81ca79e4d809ef6f5879ef8b;hp=d9401c99e743ff58c650cf4e57aeb83bad5f27aa;hpb=aea5b091954b3c823b318b392660b22c7b1e978a;p=jquery.git diff --git a/src/event.js b/src/event.js index d9401c9..ac45e7e 100644 --- a/src/event.js +++ b/src/event.js @@ -37,11 +37,11 @@ jQuery.event = { // Init the element's event structure var events = jQuery.data( elem, "events" ) || jQuery.data( elem, "events", {} ), - handle = jQuery.data( elem, "handle" ) || jQuery.data( elem, "handle", function() { + handle = jQuery.data( elem, "handle" ) || jQuery.data( elem, "handle", function eventHandle() { // Handle the second event of a trigger and when // an event is called after a page has unloaded return typeof jQuery !== "undefined" && !jQuery.event.triggered ? - jQuery.event.handle.apply( arguments.callee.elem, arguments ) : + jQuery.event.handle.apply( eventHandle.elem, arguments ) : undefined; }); // Add elem as a property of the handle function @@ -264,12 +264,12 @@ jQuery.event = { if ( !bubbling && nativeFn && !event.isDefaultPrevented() && !isClick ) { this.triggered = true; try { - nativeFn(); + elem[ type ](); // prevent IE from throwing an error for some hidden elements } catch (e) {} // Handle triggering native .onfoo handlers - } else if ( nativeHandler && nativeHandler.apply( elem, data ) === false ) { + } else if ( nativeHandler && elem[ "on" + type ].apply( elem, data ) === false ) { event.result = false; } @@ -405,7 +405,7 @@ jQuery.event = { special: { ready: { // Make sure the ready event is setup - setup: bindReady, + setup: jQuery.bindReady, teardown: function() {} }, @@ -569,9 +569,11 @@ jQuery.each({ }); // submit delegation +if ( !jQuery.support.submitBubbles ) { + jQuery.event.special.submit = { setup: function( data, namespaces, fn ) { - if ( !jQuery.support.submitBubbles && this.nodeName.toLowerCase() !== "form" ) { + if ( this.nodeName.toLowerCase() !== "form" ) { jQuery.event.add(this, "click.specialSubmit." + fn.guid, function( e ) { var elem = e.target, type = elem.type; @@ -588,8 +590,6 @@ jQuery.event.special.submit = { } }); } - - return false; }, remove: function( namespaces, fn ) { @@ -598,7 +598,11 @@ jQuery.event.special.submit = { } }; +} + // change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + jQuery.event.special.change = { filters: { click: function( e ) { @@ -647,63 +651,50 @@ jQuery.event.special.change = { } }, setup: function( data, namespaces, fn ) { - // return false if we bubble - if ( !jQuery.support.changeBubbles ) { - for ( var type in changeFilters ) { - jQuery.event.add( this, type + ".specialChange." + fn.guid, changeFilters[type] ); - } + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange." + fn.guid, changeFilters[type] ); } // always want to listen for change for trigger return false; }, remove: function( namespaces, fn ) { - if ( !jQuery.support.changeBubbles ) { - for ( var type in changeFilters ) { - jQuery.event.remove( this, type + ".specialChange" + (fn ? "."+fn.guid : ""), changeFilters[type] ); - } + for ( var type in changeFilters ) { + jQuery.event.remove( this, type + ".specialChange" + (fn ? "."+fn.guid : ""), changeFilters[type] ); } } }; var changeFilters = jQuery.event.special.change.filters; +} + function trigger( type, elem, args ) { args[0].type = type; return jQuery.event.handle.apply( elem, args ); } // Create "bubbling" focus and blur events -jQuery.each({ - focus: "focusin", - blur: "focusout" -}, function( orig, fix ){ - var event = jQuery.event, - handle = event.handle; - - function ieHandler() { - arguments[0].type = orig; - return handle.apply(this, arguments); - } +if ( !jQuery.support.focusBubbles ) { - event.special[orig] = { - setup:function() { - if ( this.addEventListener ) { - this.addEventListener( orig, handle, true ); - } else { - event.add( this, fix, ieHandler ); - } +jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ){ + event.special[ orig ] = { + setup: function() { + jQuery.event.add( this, fix, ieHandler ); }, - teardown:function() { - if ( this.removeEventListener ) { - this.removeEventListener( orig, handle, true ); - } else { - event.remove( this, fix, ieHandler ); - } + teardown: function() { + jQuery.event.remove( this, fix, ieHandler ); } }; + + function ieHandler() { + arguments[0].type = orig; + return jQuery.event.handle.apply(this, arguments); + } }); +} + jQuery.fn.extend({ // TODO: make bind(), unbind() and one() DRY! bind: function( type, data, fn, thisObject ) { @@ -806,24 +797,6 @@ jQuery.fn.extend({ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); }, - ready: function( fn ) { - // Attach the listeners - bindReady(); - - // If the DOM is already ready - if ( jQuery.isReady ) { - // Execute the function immediately - fn.call( document, jQuery ); - - // Otherwise, remember the function for later - } else { - // Add the function to the wait list - jQuery.readyList.push( fn ); - } - - return this; - }, - live: function( type, data, fn, thisObject ) { if ( jQuery.isFunction( data ) ) { if ( fn !== undefined ) { @@ -904,103 +877,6 @@ function liveConvert( type, selector ) { .replace(/ /g, "|")].join("."); } -jQuery.extend({ - isReady: false, - readyList: [], - // Handle when the DOM is ready - ready: function() { - // Make sure that the DOM is not already loaded - if ( !jQuery.isReady ) { - if ( !document.body ) { - return setTimeout( jQuery.ready, 13 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If there are functions bound, to execute - if ( jQuery.readyList ) { - // Execute all of them - var fn, i = 0; - while ( (fn = jQuery.readyList[ i++ ]) ) { - fn.call( document, jQuery ); - } - - // Reset the list of functions - jQuery.readyList = null; - } - - // Trigger any bound ready events - jQuery( document ).triggerHandler( "ready" ); - } - } -}); - -var readyBound = false; - -function bindReady() { - if ( readyBound ) { return; } - readyBound = true; - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - return jQuery.ready(); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", function() { - document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); - jQuery.ready(); - }, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent("onreadystatechange", function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", arguments.callee ); - jQuery.ready(); - } - }); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e){} - - if ( document.documentElement.doScroll && toplevel ) { - (function() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch( error ) { - setTimeout( arguments.callee, 0 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); - })(); - } - } - - // A fallback to window.onload, that will always work - jQuery.event.add( window, "load", jQuery.ready ); -} - jQuery.each( ("blur focus load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error").split(" "), function( i, name ) {