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.
This commit is contained in:
parent
04e31ff058
commit
9584e908a2
2 changed files with 37 additions and 17 deletions
16
src/event.js
16
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;
|
||||
|
||||
|
|
|
@ -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" );
|
||||
|
||||
jQuery("#liveSpan2").trigger("foo.zed");
|
||||
count1 = 0, count2 = 0;
|
||||
|
||||
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");
|
||||
|
||||
jQuery("#liveSpan1").trigger("foo.bar");
|
||||
equals( count1, 2, "Did not respond to foo.bar after dieing it" );
|
||||
count1 = 0, count2 = 0;
|
||||
|
||||
jQuery("#liveSpan2").trigger("foo.zed");
|
||||
equals( count2, 1, "Did not trigger foo.zed again" );
|
||||
jQuery("#liveSpan1").trigger("foo.bar");
|
||||
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("#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(){
|
||||
|
|
Loading…
Reference in a new issue