Fix for #964
[jquery.git] / src / event / event.js
index 812d6f2..fb7f820 100644 (file)
@@ -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,21 +55,39 @@ 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])
+               if (element.$events) {
+                       var i,j,k;
+                       if ( type && type.type ) { // type is actually an event object here
+                               handler = type.handler;
+                               type    = type.type;
+                       }
+                       
+                       if (type && element.$events[type])
+                               // remove the given handler for the given type
                                if ( handler )
-                                       delete element.events[type][handler.guid];
+                                       delete element.$events[type][handler.guid];
+                                       
+                               // remove all handlers for the given type
                                else
-                                       for ( var i in element.events[type] )
-                                               delete element.events[type][i];
+                                       for ( i in element.$events[type] )
+                                               delete element.$events[type][i];
+                                               
+                       // remove all handlers          
                        else
-                               for ( var j in element.events )
+                               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;
+                               }
+                       if (!k) element["on" + type] = null;
+               }
        },
 
-       trigger: function(type,data,element) {
+       trigger: function(type, data, element) {
                // Clone the incoming data, if any
                data = jQuery.makeArray(data || []);
 
@@ -111,7 +129,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 );
@@ -313,9 +331,19 @@ jQuery.fn.extend({
         * @before <p click="alert('hello')">Hello</p>
         * @result alert('hello')
         *
+        * @example $("p").click(function(event, a, b) {
+        *   // 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
+        * 
+        * @before <p click="alert('hello')">Hello</p>
+        * @result alert('hello')
+        *
         * @name trigger
         * @type jQuery
         * @param String type An event type to trigger.
+        * @param Array data (optional) Additional data to pass as arguments (after the event object) to the event handler
         * @cat Events
         */
        trigger: function( type, data ) {
@@ -419,7 +447,7 @@ jQuery.fn.extend({
         *
         * 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
-        * can therefore stick with the $ alias without risc of naming collisions.
+        * can therefore stick with the $ alias without risk of naming collisions.
         * 
         * Please ensure you have no code in your &lt;body&gt; onload event handler, 
         * otherwise $(document).ready() may not fire.