Commit 9584e908 authored by jeresig's avatar jeresig

Added in Ben Alman's proposed event.namespace property (the property holds the...

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.
parent 04e31ff0
...@@ -368,7 +368,7 @@ jQuery.event = { ...@@ -368,7 +368,7 @@ jQuery.event = {
}, },
handle: function( 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 = args[0] = jQuery.event.fix( event || window.event );
event.currentTarget = this; event.currentTarget = this;
...@@ -379,7 +379,9 @@ jQuery.event = { ...@@ -379,7 +379,9 @@ jQuery.event = {
if ( !all ) { if ( !all ) {
namespaces = event.type.split("."); namespaces = event.type.split(".");
event.type = namespaces.shift(); 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"); events = jQuery.data(this, "events");
...@@ -393,7 +395,7 @@ jQuery.event = { ...@@ -393,7 +395,7 @@ jQuery.event = {
var handleObj = handlers[ j ]; var handleObj = handlers[ j ];
// Filter the functions by class // 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 // Pass in a reference to the handler function itself
// So that we can later remove it // So that we can later remove it
event.handler = handleObj.handler; event.handler = handleObj.handler;
...@@ -997,7 +999,7 @@ jQuery.each(["live", "die"], function( i, name ) { ...@@ -997,7 +999,7 @@ jQuery.each(["live", "die"], function( i, name ) {
function liveHandler( event ) { function liveHandler( event ) {
var stop, maxLevel, elems = [], selectors = [], 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" ); events = jQuery.data( this, "events" );
// Make sure we avoid non-left-click bubbling in Firefox (#3861) // Make sure we avoid non-left-click bubbling in Firefox (#3861)
...@@ -1005,6 +1007,10 @@ function liveHandler( event ) { ...@@ -1005,6 +1007,10 @@ function liveHandler( event ) {
return; return;
} }
if ( event.namespace ) {
namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
}
event.liveFired = this; event.liveFired = this;
var live = events.live.slice(0); var live = events.live.slice(0);
...@@ -1028,7 +1034,7 @@ function liveHandler( event ) { ...@@ -1028,7 +1034,7 @@ function liveHandler( event ) {
for ( j = 0; j < live.length; j++ ) { for ( j = 0; j < live.length; j++ ) {
handleObj = live[j]; handleObj = live[j];
if ( close.selector === handleObj.selector ) { if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
elem = close.elem; elem = close.elem;
related = null; related = null;
......
...@@ -1135,41 +1135,55 @@ test("live with multiple events", function(){ ...@@ -1135,41 +1135,55 @@ test("live with multiple events", function(){
}); });
test("live with namespaces", function(){ test("live with namespaces", function(){
expect(6); expect(12);
var count1 = 0, count2 = 0; var count1 = 0, count2 = 0;
jQuery("#liveSpan1").live("foo.bar", function(){ jQuery("#liveSpan1").live("foo.bar", function(e){
count1++; count1++;
}); });
jQuery("#liveSpan2").live("foo.zed", function(){ jQuery("#liveSpan1").live("foo.zed", function(e){
count2++; count2++;
}); });
jQuery("#liveSpan1").trigger("foo.bar"); jQuery("#liveSpan1").trigger("foo.bar");
equals( count1, 1, "Got live 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" ); equals( count2, 1, "Got live foo.zed" );
//remove one //remove one
jQuery("#liveSpan2").die("foo.zed"); count1 = 0, count2 = 0;
jQuery("#liveSpan1").die("foo.zed");
jQuery("#liveSpan1").trigger("foo.bar"); 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"); count1 = 0, count2 = 0;
equals( count2, 1, "Got live foo.zed" );
jQuery("#liveSpan1").trigger("foo.zed");
equals( count1, 0, "Got live foo.zed" );
equals( count2, 0, "Got live foo.zed" );
//remove the other //remove the other
jQuery("#liveSpan1").die("foo.bar"); jQuery("#liveSpan1").die("foo.bar");
count1 = 0, count2 = 0;
jQuery("#liveSpan1").trigger("foo.bar"); 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"); jQuery("#liveSpan1").trigger("foo.zed");
equals( count2, 1, "Did not trigger foo.zed again" ); equals( count1, 0, "Did not trigger foo.zed again" );
equals( count2, 0, "Did not trigger foo.zed again" );
}); });
test("live with change", function(){ test("live with change", function(){
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment