// around, causing it to be cloned in the process
if ( jQuery.browser.msie && element.setInterval != undefined )
element = window;
-
+
// Make sure that the function being executed has a unique ID
if ( !handler.guid )
handler.guid = this.guid++;
// if data is passed, bind to handler
if( data != undefined ) {
- // Create temporary function pointer to original handler
+ // Create temporary function pointer to original handler
var fn = handler;
// Create unique handler function, wrapped around original handler
handler.guid = fn.guid;
}
+ // Namespaced event handlers
+ var parts = type.split(".");
+ type = parts[0];
+ handler.type = parts[1];
+
// Init the element's event structure
if (!element.$events)
element.$events = {};
remove: function(element, type, handler) {
var events = element.$events, ret, index;
+ // Namespaced event handlers
+ if ( typeof type == "string" ) {
+ var parts = type.split(".");
+ type = parts[0];
+ }
+
if ( events ) {
// type is actually an event object here
if ( type && type.type ) {
// remove all handlers for the given type
else
for ( handler in element.$events[type] )
- delete events[type][handler];
+ // Handle the removal of namespaced events
+ if ( !parts[1] || events[type][handler].type == parts[1] )
+ delete events[type][handler];
// remove generic event handler if no more handlers exist
for ( ret in events[type] ) break;
// Empty object is for triggered events with no data
event = jQuery.event.fix( event || window.event || {} );
+ // Namespaced event handlers
+ var parts = event.type.split(".");
+ event.type = parts[0];
+
var c = this.$events && this.$events[event.type], args = Array.prototype.slice.call( arguments, 1 );
args.unshift( event );
args[0].handler = c[j];
args[0].data = c[j].data;
- var tmp = c[j].apply( this, args );
+ // Filter the functions by class
+ if ( !parts[1] || c[j].type == parts[1] ) {
+ var tmp = c[j].apply( this, args );
- if ( val !== false )
- val = tmp;
+ if ( val !== false )
+ val = tmp;
- if ( tmp === false ) {
- event.preventDefault();
- event.stopPropagation();
+ if ( tmp === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
}
}
module("event");
test("bind()", function() {
- expect(11);
+ expect(15);
var handler = function(event) {
ok( event.data, "bind() with data, check passed data exists" );
$("select").each(function(i){
$(this).bind('change', i, selectOnChange);
}).trigger('change');
+
+ reset();
+
+ $("#firstp").bind("click",function(e){
+ ok(true, "Normal click triggered");
+ });
+
+ $("#firstp").bind("click.test",function(e){
+ ok(true, "Namespaced click triggered");
+ });
+
+ // Trigger both bound fn (2)
+ $("#firstp").trigger("click");
+
+ // Trigger one bound fn (1)
+ $("#firstp").trigger("click.test");
+
+ // Remove only the one fn
+ $("#firstp").unbind("click.test");
+
+ // Trigger the remaining fn (1)
+ $("#firstp").trigger("click");
});
test("click()", function() {