diff --git a/src/event.js b/src/event.js index 4681140be..a5f8b6f54 100644 --- a/src/event.js +++ b/src/event.js @@ -67,6 +67,11 @@ jQuery.event = { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; diff --git a/test/unit/event.js b/test/unit/event.js index f08f5141e..d6b27fd6d 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -555,6 +555,22 @@ test("bind(), multi-namespaced events", function() { jQuery("#firstp").trigger("custom"); }); +test("namespace-only event binding is a no-op", function(){ + expect(2); + + jQuery("#firstp") + .on( ".whoops", function() { + ok( false, "called a namespace-only event" ); + }) + .on( "whoops", function() { + ok( true, "called whoops" ); + }) + .trigger("whoops") // 1 + .off(".whoops") + .trigger("whoops") // 2 + .off("whoops"); +}); + test("bind(), with same function", function() { expect(2);