aboutsummaryrefslogtreecommitdiffstats
path: root/src/event
diff options
context:
space:
mode:
authorJohn Resig <jeresig@gmail.com>2007-09-03 14:53:09 +0000
committerJohn Resig <jeresig@gmail.com>2007-09-03 14:53:09 +0000
commit456f0fe5985eaad42eba456b9ff710771669607c (patch)
treefa80f9dceb0efac68d44275cd14664bcadd0c690 /src/event
parenta5c319f922efcf34652d0632a945d20a0ab36ca6 (diff)
downloadjquery-456f0fe5985eaad42eba456b9ff710771669607c.tar.gz
jquery-456f0fe5985eaad42eba456b9ff710771669607c.zip
Added namespaced events to bind, unbind, and trigger. This allows you to deal with event handlers of a specific "class" (great for plugins).
Diffstat (limited to 'src/event')
-rw-r--r--src/event/event.js38
-rw-r--r--src/event/eventTest.js24
2 files changed, 52 insertions, 10 deletions
diff --git a/src/event/event.js b/src/event/event.js
index 3df1ae716..6224d13bc 100644
--- a/src/event/event.js
+++ b/src/event/event.js
@@ -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();
+ }
}
}
diff --git a/src/event/eventTest.js b/src/event/eventTest.js
index 7ae9e6d35..cacfdeb66 100644
--- a/src/event/eventTest.js
+++ b/src/event/eventTest.js
@@ -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() {