X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent%2Fevent.js;h=2d9c53056e9765ae49fc4000a87535796f8419ee;hb=11b64c1149a0d49d105b50a2869d74cbe18613ed;hp=fb7f820ca7d859b00d0204c7eefad669b33740c9;hpb=34cb5b5812db50d921f7c7a0c398eb68167b3da3;p=jquery.git diff --git a/src/event/event.js b/src/event/event.js index fb7f820..2d9c530 100644 --- a/src/event/event.js +++ b/src/event/event.js @@ -12,11 +12,25 @@ jQuery.event = { // around, causing it to be cloned in the process if ( jQuery.browser.msie && element.setInterval != undefined ) element = window; + + // if data is passed, bind to handler + if( data != handler ) { + // Create temporary function pointer to original handler + var fn = handler; + + // Create unique handler function, wrapped around original handler + handler = function() { + // Pass arguments and context to original handler + return fn.apply(this, arguments); + }; - // if data is passed, bind to handler - if( data ) + // Store data in unique handler handler.data = data; + // Set the guid of unique handler to the same of original handler, so it can be removed + handler.guid = fn.guid; + } + // Make sure that the function being executed has a unique ID if ( !handler.guid ) handler.guid = this.guid++; @@ -24,26 +38,29 @@ jQuery.event = { // Init the element's event structure if (!element.$events) element.$events = {}; + + if (!element.$handle) + element.$handle = function() { + jQuery.event.handle.apply(element, arguments); + }; // Get the current list of functions bound to this event var handlers = element.$events[type]; - // If it hasn't been initialized yet + // Init the event handler queue if (!handlers) { - // Init the event handler queue - handlers = element.$events[type] = {}; - - // Remember an existing handler, if it's already there - if (element["on" + type]) - handlers[0] = element["on" + type]; + handlers = element.$events[type] = {}; + + // And bind the global event handler to the element + if (element.addEventListener) + element.addEventListener(type, element.$handle, false); + else if (element.attachEvent) + element.attachEvent("on" + type, element.$handle); } // Add the function to the element's handler list handlers[handler.guid] = handler; - // And bind the global event handler to the element - element["on" + type] = this.handle; - // Remember the function in a global list (for triggering) if (!this.global[type]) this.global[type] = []; @@ -55,35 +72,45 @@ jQuery.event = { // Detach an event or set of events from an element remove: function(element, type, handler) { - if (element.$events) { - var i,j,k; - if ( type && type.type ) { // type is actually an event object here + var events = element.$events, ret; + + if ( events ) { + // type is actually an event object here + if ( type && type.type ) { handler = type.handler; - type = type.type; + type = type.type; } - if (type && element.$events[type]) + if ( !type ) { + for ( type in events ) + this.remove( element, type ); + + } else if ( events[type] ) { // remove the given handler for the given type if ( handler ) - delete element.$events[type][handler.guid]; - + delete events[type][handler.guid]; + // remove all handlers for the given type else - for ( i in element.$events[type] ) - delete element.$events[type][i]; - - // remove all handlers - else - for ( j in element.$events ) - this.remove( element, j ); - - // remove event handler if no more handlers exist - for ( k in element.$events[type] ) - if (k) { - k = true; - break; + for ( handler in element.$events[type] ) + delete events[type][handler]; + + // remove generic event handler if no more handlers exist + for ( ret in events[type] ) break; + if ( !ret ) { + if (element.removeEventListener) + element.removeEventListener(type, element.$handle, false); + else if (element.detachEvent) + element.detachEvent("on" + type, element.$handle); + ret = null; + delete events[type]; } - if (!k) element["on" + type] = null; + } + + // Remove the expando if it's no longer used + for ( ret in events ) break; + if ( !ret ) + element.$handle = element.$events = null; } }, @@ -99,19 +126,16 @@ jQuery.event = { // Handle triggering a single element else { - var handler = element["on" + type ], val, - fn = jQuery.isFunction( element[ type ] ); + var val, ret, fn = jQuery.isFunction( element[ type ] ); + + // Pass along a fake event + data.unshift( this.fix({ type: type, target: element }) ); - if ( handler ) { - // Pass along a fake event - data.unshift( this.fix({ type: type, target: element }) ); - - // Trigger the event - if ( (val = handler.apply( element, data )) !== false ) - this.triggered = true; - } + // Trigger the event + if ( (val = this.handle.apply( element, data )) !== false ) + this.triggered = true; - if ( fn && val !== false ) + if ( fn && val !== false && !jQuery.nodeName(element, 'a') ) element[ type ](); this.triggered = false; @@ -210,7 +234,7 @@ jQuery.fn.extend({ * * In most cases, you can define your event handlers as anonymous functions * (see first example). In cases where that is not possible, you can pass additional - * data as the second paramter (and the handler function as the third), see + * data as the second parameter (and the handler function as the third), see * second example. * * @example $("p").bind("click", function(){ @@ -250,7 +274,7 @@ jQuery.fn.extend({ */ bind: function( type, data, fn ) { return this.each(function(){ - jQuery.event.add( this, type, fn || data, data ); + jQuery.event.add( this, type, fn || data, fn && data ); }); }, @@ -285,7 +309,7 @@ jQuery.fn.extend({ jQuery.event.add( this, type, function(event) { jQuery(this).unbind(event); return (fn || data).apply( this, arguments); - }, data); + }, fn && data); }); }, @@ -325,7 +349,14 @@ jQuery.fn.extend({ }, /** - * Trigger a type of event on every matched element. + * Trigger a type of event on every matched element. This will also cause + * the default action of the browser with the same name (if one exists) + * to be executed. For example, passing 'submit' to the trigger() + * function will also cause the browser to submit the form. This + * default action can be prevented by returning false from one of + * the functions bound to the event. + * + * You can also trigger custom events registered with bind. * * @example $("p").trigger("click") * @before

Hello

@@ -335,10 +366,13 @@ jQuery.fn.extend({ * // when a normal click fires, a and b are undefined * // for a trigger like below a refers too "foo" and b refers to "bar" * }).trigger("click", ["foo", "bar"]); - * @desc Example of how to pass arbitrary to an event + * @desc Example of how to pass arbitrary data to an event * - * @before

Hello

- * @result alert('hello') + * @example $("p").bind("myEvent",function(event,message1,message2) { + * alert(message1 + ' ' + message2); + * }); + * $("p").trigger("myEvent",["Hello","World"]); + * @result alert('Hello World') // One for each paragraph * * @name trigger * @type jQuery @@ -402,9 +436,9 @@ jQuery.fn.extend({ * (a common error in using a mouseout event handler). * * @example $("p").hover(function(){ - * $(this).addClass("over"); + * $(this).addClass("hover"); * },function(){ - * $(this).addClass("out"); + * $(this).removeClass("hover"); * }); * * @name hover @@ -441,9 +475,9 @@ jQuery.fn.extend({ * the response times of your web applications. * * In a nutshell, this is a solid replacement for using window.onload, - * and attaching a function to that. By using this method, your bound Function + * and attaching a function to that. By using this method, your bound function * will be called the instant the DOM is ready to be read and manipulated, - * which is exactly what 99.99% of all Javascript code needs to run. + * which is when what 99.99% of all JavaScript code needs to run. * * There is one argument passed to the ready event handler: A reference to * the jQuery function. You can name that argument whatever you like, and @@ -460,7 +494,7 @@ jQuery.fn.extend({ * @example jQuery(function($) { * // Your code using failsafe $ alias here... * }); - * @desc Uses both the shortcut for $(document).ready() and the argument + * @desc Uses both the [[Core#.24.28_fn_.29|shortcut]] for $(document).ready() and the argument * to write failsafe jQuery code using the $ alias, without relying on the * global alias. * @@ -550,13 +584,15 @@ new function(){ /** * Trigger the submit event of each matched element. This causes all of the functions - * that have been bound to thet submit event to be executed. + * that have been bound to that submit event to be executed, and calls the browser's + * default submit action on the matching element(s). This default action can be prevented + * by returning false from one of the functions bound to the submit event. * * Note: This does not execute the submit method of the form element! If you need to * submit the form via code, you have to use the DOM method, eg. $("form")[0].submit(); * * @example $("form").submit(); - * @desc Triggers all submit events registered for forms, but does not submit the form + * @desc Triggers all submit events registered to the matched form(s), and submits them. * * @name submit * @type jQuery @@ -659,7 +695,9 @@ new function(){ /** * Trigger the blur event of each matched element. This causes all of the functions - * that have been bound to thet blur event to be executed. + * that have been bound to that blur event to be executed, and calls the browser's + * default blur action on the matching element(s). This default action can be prevented + * by returning false from one of the functions bound to the blur event. * * Note: This does not execute the blur method of the underlying elements! If you need to * blur an element via code, you have to use the DOM method, eg. $("#myinput")[0].blur(); @@ -701,7 +739,9 @@ new function(){ /** * Trigger the select event of each matched element. This causes all of the functions - * that have been bound to thet select event to be executed. + * that have been bound to that select event to be executed, and calls the browser's + * default select action on the matching element(s). This default action can be prevented + * by returning false from one of the functions bound to the select event. * * @example $("p").select(); * @before

Hello