Added namespaced events to bind, unbind, and trigger. This allows you to deal with...
authorJohn Resig <jeresig@gmail.com>
Mon, 3 Sep 2007 14:53:09 +0000 (14:53 +0000)
committerJohn Resig <jeresig@gmail.com>
Mon, 3 Sep 2007 14:53:09 +0000 (14:53 +0000)
src/event/event.js
src/event/eventTest.js

index 3df1ae7..6224d13 100644 (file)
@@ -12,14 +12,14 @@ jQuery.event = {
                // around, causing it to be cloned in the process
                if ( jQuery.browser.msie && element.setInterval != undefined )
                        element = window;
-               
+
                // Make sure that the function being executed has a unique ID
                if ( !handler.guid )
                        handler.guid = this.guid++;
                        
                // if data is passed, bind to handler 
                if( data != undefined ) { 
-               // Create temporary function pointer to original handler 
+                       // Create temporary function pointer to original handler 
                        var fn = handler; 
 
                        // Create unique handler function, wrapped around original handler 
@@ -35,6 +35,11 @@ jQuery.event = {
                        handler.guid = fn.guid;
                }
 
+               // Namespaced event handlers
+               var parts = type.split(".");
+               type = parts[0];
+               handler.type = parts[1];
+
                // Init the element's event structure
                if (!element.$events)
                        element.$events = {};
@@ -82,6 +87,12 @@ jQuery.event = {
        remove: function(element, type, handler) {
                var events = element.$events, ret, index;
 
+               // Namespaced event handlers
+               if ( typeof type == "string" ) {
+                       var parts = type.split(".");
+                       type = parts[0];
+               }
+
                if ( events ) {
                        // type is actually an event object here
                        if ( type && type.type ) {
@@ -101,7 +112,9 @@ jQuery.event = {
                                // remove all handlers for the given type
                                else
                                        for ( handler in element.$events[type] )
-                                               delete events[type][handler];
+                                               // Handle the removal of namespaced events
+                                               if ( !parts[1] || events[type][handler].type == parts[1] )
+                                                       delete events[type][handler];
 
                                // remove generic event handler if no more handlers exist
                                for ( ret in events[type] ) break;
@@ -177,6 +190,10 @@ jQuery.event = {
                // Empty object is for triggered events with no data
                event = jQuery.event.fix( event || window.event || {} ); 
 
+               // Namespaced event handlers
+               var parts = event.type.split(".");
+               event.type = parts[0];
+
                var c = this.$events && this.$events[event.type], args = Array.prototype.slice.call( arguments, 1 );
                args.unshift( event );
 
@@ -186,14 +203,17 @@ jQuery.event = {
                        args[0].handler = c[j];
                        args[0].data = c[j].data;
 
-                       var tmp = c[j].apply( this, args );
+                       // Filter the functions by class
+                       if ( !parts[1] || c[j].type == parts[1] ) {
+                               var tmp = c[j].apply( this, args );
 
-                       if ( val !== false )
-                               val = tmp;
+                               if ( val !== false )
+                                       val = tmp;
 
-                       if ( tmp === false ) {
-                               event.preventDefault();
-                               event.stopPropagation();
+                               if ( tmp === false ) {
+                                       event.preventDefault();
+                                       event.stopPropagation();
+                               }
                        }
                }
 
index 7ae9e6d..cacfdeb 100644 (file)
@@ -1,7 +1,7 @@
 module("event");
 
 test("bind()", function() {
-       expect(11);
+       expect(15);
 
        var handler = function(event) {
                ok( event.data, "bind() with data, check passed data exists" );
@@ -45,6 +45,28 @@ test("bind()", function() {
        $("select").each(function(i){
                $(this).bind('change', i, selectOnChange);
        }).trigger('change');
+
+       reset();
+
+        $("#firstp").bind("click",function(e){
+               ok(true, "Normal click triggered");
+        });
+
+        $("#firstp").bind("click.test",function(e){
+               ok(true, "Namespaced click triggered");
+        });
+
+       // Trigger both bound fn (2)
+        $("#firstp").trigger("click");
+
+       // Trigger one bound fn (1)
+        $("#firstp").trigger("click.test");
+
+       // Remove only the one fn
+        $("#firstp").unbind("click.test");
+
+       // Trigger the remaining fn (1)
+        $("#firstp").trigger("click");
 });
 
 test("click()", function() {