X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;ds=inline;f=src%2Fevent%2Fevent.js;h=e0d4b908eed7cc9ab50b2058940d9fcfa45be13c;hb=e2b52e1e401af05a6fe3ca7bf9e714f973fc4d61;hp=02bdbe4e3135a82f282654d4442bfa89a7b0ba05;hpb=670d2f4140070b76c87e15c26a5787f505f5793e;p=jquery.git diff --git a/src/event/event.js b/src/event/event.js index 02bdbe4..e0d4b90 100644 --- a/src/event/event.js +++ b/src/event/event.js @@ -22,16 +22,16 @@ jQuery.event = { handler.guid = this.guid++; // Init the element's event structure - if (!element.events) - element.events = {}; + if (!element.$events) + element.$events = {}; // Get the current list of functions bound to this event - var handlers = element.events[type]; + var handlers = element.$events[type]; // If it hasn't been initialized yet if (!handlers) { // Init the event handler queue - handlers = element.events[type] = {}; + handlers = element.$events[type] = {}; // Remember an existing handler, if it's already there if (element["on" + type]) @@ -55,18 +55,42 @@ jQuery.event = { // Detach an event or set of events from an element remove: function(element, type, handler) { - if (element.events) - if ( type && type.type ) - delete element.events[ type.type ][ type.handler.guid ]; - else if (type && element.events[type]) + var events = element.$events, ret; + + if ( events ) { + // type is actually an event object here + if ( type && type.type ) { + handler = type.handler; + type = type.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 ( var i in element.events[type] ) - delete element.events[type][i]; - else - for ( var j in element.events ) - this.remove( element, j ); + 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 ) { + ret = element["on" + type] = null; + delete events[type]; + } + } + + // Remove the expando if it's no longer used + for ( ret in events ) break; + if ( !ret ) + element.$events = null; + } }, trigger: function(type, data, element) { @@ -111,7 +135,7 @@ jQuery.event = { // returned undefined or false var returnValue; - var c = this.events[event.type]; + var c = this.$events[event.type]; var args = [].slice.call( arguments, 1 ); args.unshift( event ); @@ -192,7 +216,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(){ @@ -307,7 +331,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
@@ -317,10 +348,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 * - * @beforeHello
- * @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 @@ -384,9 +418,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 @@ -423,9 +457,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 @@ -442,7 +476,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. * @@ -532,13 +566,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 @@ -641,7 +677,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(); @@ -683,7 +721,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(); * @beforeHello