Added namespaced events to bind, unbind, and trigger. This allows you to deal with event handlers of a specific "class" (great for plugins).
This commit is contained in:
parent
a5c319f922
commit
456f0fe598
|
@ -12,14 +12,14 @@ jQuery.event = {
|
|||
// 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
|
||||
|
@ -35,6 +35,11 @@ jQuery.event = {
|
|||
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 = {};
|
||||
|
@ -82,6 +87,12 @@ jQuery.event = {
|
|||
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 ) {
|
||||
|
@ -101,7 +112,9 @@ jQuery.event = {
|
|||
// 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;
|
||||
|
@ -177,6 +190,10 @@ jQuery.event = {
|
|||
// 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 );
|
||||
|
||||
|
@ -186,14 +203,17 @@ jQuery.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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module("event");
|
||||
|
||||
test("bind()", function() {
|
||||
expect(11);
|
||||
expect(15);
|
||||
|
||||
var handler = function(event) {
|
||||
ok( event.data, "bind() with data, check passed data exists" );
|
||||
|
@ -45,6 +45,28 @@ test("bind()", function() {
|
|||
$("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() {
|
||||
|
|
Loading…
Reference in a new issue