Added support for multiple-namespaced events (in bind, trigger, and unbind).
This commit is contained in:
parent
4c1e12e889
commit
77344f4c50
17
src/event.js
17
src/event.js
|
@ -53,8 +53,8 @@ jQuery.event = {
|
||||||
jQuery.each(types.split(/\s+/), function(index, type) {
|
jQuery.each(types.split(/\s+/), function(index, type) {
|
||||||
// Namespaced event handlers
|
// Namespaced event handlers
|
||||||
var parts = type.split(".");
|
var parts = type.split(".");
|
||||||
type = parts[0];
|
type = parts.shift();
|
||||||
handler.type = parts[1];
|
handler.type = parts.sort().join(".");
|
||||||
|
|
||||||
// Get the current list of functions bound to this event
|
// Get the current list of functions bound to this event
|
||||||
var handlers = events[type];
|
var handlers = events[type];
|
||||||
|
@ -113,8 +113,9 @@ jQuery.event = {
|
||||||
// jQuery(...).unbind("mouseover mouseout", fn);
|
// jQuery(...).unbind("mouseover mouseout", fn);
|
||||||
jQuery.each(types.split(/\s+/), function(index, type){
|
jQuery.each(types.split(/\s+/), function(index, type){
|
||||||
// Namespaced event handlers
|
// Namespaced event handlers
|
||||||
var parts = type.split(".");
|
var namespace = type.split(".");
|
||||||
type = parts[0];
|
type = namespace.shift();
|
||||||
|
namespace = RegExp(namespace.sort().join(".*\\.") + "(\\.|$)");
|
||||||
|
|
||||||
if ( events[type] ) {
|
if ( events[type] ) {
|
||||||
// remove the given handler for the given type
|
// remove the given handler for the given type
|
||||||
|
@ -125,7 +126,7 @@ jQuery.event = {
|
||||||
else
|
else
|
||||||
for ( handler in events[type] )
|
for ( handler in events[type] )
|
||||||
// Handle the removal of namespaced events
|
// Handle the removal of namespaced events
|
||||||
if ( !parts[1] || events[type][handler].type == parts[1] )
|
if ( namespace.test(events[type][handler].type) )
|
||||||
delete events[type][handler];
|
delete events[type][handler];
|
||||||
|
|
||||||
// remove generic event handler if no more handlers exist
|
// remove generic event handler if no more handlers exist
|
||||||
|
@ -246,8 +247,8 @@ jQuery.event = {
|
||||||
|
|
||||||
// Namespaced event handlers
|
// Namespaced event handlers
|
||||||
namespace = event.type.split(".");
|
namespace = event.type.split(".");
|
||||||
event.type = namespace[0];
|
event.type = namespace.shift();
|
||||||
namespace = namespace[1];
|
namespace = RegExp(namespace.sort().join(".*\\.") + "(\\.|$)");
|
||||||
// Cache this now, all = true means, any handler
|
// Cache this now, all = true means, any handler
|
||||||
all = !namespace && !event.exclusive;
|
all = !namespace && !event.exclusive;
|
||||||
|
|
||||||
|
@ -257,7 +258,7 @@ jQuery.event = {
|
||||||
var handler = handlers[j];
|
var handler = handlers[j];
|
||||||
|
|
||||||
// Filter the functions by class
|
// Filter the functions by class
|
||||||
if ( all || handler.type == namespace ) {
|
if ( all || namespace.test(handler.type) ) {
|
||||||
// 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 = handler;
|
event.handler = handler;
|
||||||
|
|
|
@ -112,6 +112,60 @@ test("bind(), namespaced events, cloned events", function() {
|
||||||
ok( jQuery("a.test:first").triggerHandler("click") === false, "Handler is bound to appendTo'd elements" );
|
ok( jQuery("a.test:first").triggerHandler("click") === false, "Handler is bound to appendTo'd elements" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("bind(), multi-namespaced events", function() {
|
||||||
|
expect(6);
|
||||||
|
|
||||||
|
var order = [
|
||||||
|
"click.test.abc",
|
||||||
|
"click.test.abc",
|
||||||
|
"click.test",
|
||||||
|
"click.test.abc",
|
||||||
|
"click.test",
|
||||||
|
"custom.test2"
|
||||||
|
];
|
||||||
|
|
||||||
|
function check(name, msg){
|
||||||
|
same(name, order.shift(), msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery("#firstp").bind("custom.test",function(e){
|
||||||
|
check("custom.test", "Custom event triggered");
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery("#firstp").bind("custom.test2",function(e){
|
||||||
|
check("custom.test2", "Custom event triggered");
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery("#firstp").bind("click.test",function(e){
|
||||||
|
check("click.test", "Normal click triggered");
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery("#firstp").bind("click.test.abc",function(e){
|
||||||
|
check("click.test.abc", "Namespaced click triggered");
|
||||||
|
});
|
||||||
|
|
||||||
|
// Trigger both bound fn (1)
|
||||||
|
jQuery("#firstp").trigger("click.test.abc");
|
||||||
|
|
||||||
|
// Trigger one bound fn (1)
|
||||||
|
jQuery("#firstp").trigger("click.abc");
|
||||||
|
|
||||||
|
// Trigger two bound fn (2)
|
||||||
|
jQuery("#firstp").trigger("click.test");
|
||||||
|
|
||||||
|
// Remove only the one fn
|
||||||
|
jQuery("#firstp").unbind("click.abc");
|
||||||
|
|
||||||
|
// Trigger the remaining fn (1)
|
||||||
|
jQuery("#firstp").trigger("click");
|
||||||
|
|
||||||
|
// Remove the remaining fn
|
||||||
|
jQuery("#firstp").unbind(".test");
|
||||||
|
|
||||||
|
// Trigger the remaining fn (1)
|
||||||
|
jQuery("#firstp").trigger("custom");
|
||||||
|
});
|
||||||
|
|
||||||
test("trigger() shortcuts", function() {
|
test("trigger() shortcuts", function() {
|
||||||
expect(6);
|
expect(6);
|
||||||
jQuery('<li><a href="#">Change location</a></li>').prependTo('#firstUL').find('a').bind('click', function() {
|
jQuery('<li><a href="#">Change location</a></li>').prependTo('#firstUL').find('a').bind('click', function() {
|
||||||
|
|
Loading…
Reference in a new issue