From 9584e908a2daa2a72bd738302dba7cfd0656dbdf Mon Sep 17 00:00:00 2001 From: jeresig Date: Tue, 2 Mar 2010 17:34:12 -0500 Subject: [PATCH] Added in Ben Alman's proposed event.namespace property (the property holds the namespaces specified in a call to trigger). Additionally fixes namespaces with .live(). Fixes #6208 and #6209. --- src/event.js | 16 +++++++++++----- test/unit/event.js | 36 +++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/event.js b/src/event.js index cec2845..b549cd5 100644 --- a/src/event.js +++ b/src/event.js @@ -368,7 +368,7 @@ jQuery.event = { }, handle: function( event ) { - var all, handlers, namespaces, namespace, events, args = jQuery.makeArray( arguments ); + var all, handlers, namespaces, namespace_sort = [], namespace_re, events, args = jQuery.makeArray( arguments ); event = args[0] = jQuery.event.fix( event || window.event ); event.currentTarget = this; @@ -379,7 +379,9 @@ jQuery.event = { if ( !all ) { namespaces = event.type.split("."); event.type = namespaces.shift(); - namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); + namespace_sort = namespaces.slice(0).sort(); + namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); + event.namespace = namespace_sort.join("."); } events = jQuery.data(this, "events"); @@ -393,7 +395,7 @@ jQuery.event = { var handleObj = handlers[ j ]; // Filter the functions by class - if ( all || namespace.test( handleObj.namespace ) ) { + if ( all || namespace_re.test( handleObj.namespace ) ) { // Pass in a reference to the handler function itself // So that we can later remove it event.handler = handleObj.handler; @@ -997,7 +999,7 @@ jQuery.each(["live", "die"], function( i, name ) { function liveHandler( event ) { var stop, maxLevel, elems = [], selectors = [], - related, match, handleObj, elem, j, i, l, data, close, + related, match, handleObj, elem, j, i, l, data, close, namespace, events = jQuery.data( this, "events" ); // Make sure we avoid non-left-click bubbling in Firefox (#3861) @@ -1005,6 +1007,10 @@ function liveHandler( event ) { return; } + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + event.liveFired = this; var live = events.live.slice(0); @@ -1028,7 +1034,7 @@ function liveHandler( event ) { for ( j = 0; j < live.length; j++ ) { handleObj = live[j]; - if ( close.selector === handleObj.selector ) { + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) { elem = close.elem; related = null; diff --git a/test/unit/event.js b/test/unit/event.js index b224070..786a46e 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -1135,41 +1135,55 @@ test("live with multiple events", function(){ }); test("live with namespaces", function(){ - expect(6); + expect(12); var count1 = 0, count2 = 0; - jQuery("#liveSpan1").live("foo.bar", function(){ + jQuery("#liveSpan1").live("foo.bar", function(e){ count1++; }); - jQuery("#liveSpan2").live("foo.zed", function(){ + jQuery("#liveSpan1").live("foo.zed", function(e){ count2++; }); jQuery("#liveSpan1").trigger("foo.bar"); equals( count1, 1, "Got live foo.bar" ); + equals( count2, 0, "Got live foo.bar" ); + + count1 = 0, count2 = 0; - jQuery("#liveSpan2").trigger("foo.zed"); + jQuery("#liveSpan1").trigger("foo.zed"); + equals( count1, 0, "Got live foo.zed" ); equals( count2, 1, "Got live foo.zed" ); //remove one - jQuery("#liveSpan2").die("foo.zed"); + count1 = 0, count2 = 0; + + jQuery("#liveSpan1").die("foo.zed"); jQuery("#liveSpan1").trigger("foo.bar"); - equals( count1, 2, "Got live foo.bar after dieing foo.zed" ); + equals( count1, 1, "Got live foo.bar after dieing foo.zed" ); + equals( count2, 0, "Got live foo.bar after dieing foo.zed" ); - jQuery("#liveSpan2").trigger("foo.zed"); - equals( count2, 1, "Got live foo.zed" ); + count1 = 0, count2 = 0; + + jQuery("#liveSpan1").trigger("foo.zed"); + equals( count1, 0, "Got live foo.zed" ); + equals( count2, 0, "Got live foo.zed" ); //remove the other jQuery("#liveSpan1").die("foo.bar"); + count1 = 0, count2 = 0; + jQuery("#liveSpan1").trigger("foo.bar"); - equals( count1, 2, "Did not respond to foo.bar after dieing it" ); + equals( count1, 0, "Did not respond to foo.bar after dieing it" ); + equals( count2, 0, "Did not respond to foo.bar after dieing it" ); - jQuery("#liveSpan2").trigger("foo.zed"); - equals( count2, 1, "Did not trigger foo.zed again" ); + jQuery("#liveSpan1").trigger("foo.zed"); + equals( count1, 0, "Did not trigger foo.zed again" ); + equals( count2, 0, "Did not trigger foo.zed again" ); }); test("live with change", function(){ -- 1.7.10.4