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 = {
},
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;
......
......@@ -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(){
......
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