From: jeresig Date: Mon, 25 Jan 2010 21:45:39 +0000 (-0500) Subject: Make sure multiple bound events have their namespaces and data maintained. Fixes... X-Git-Url: http://git.asbjorn.biz/?p=jquery.git;a=commitdiff_plain;h=0474917c9d82fa13d865282d2da2d3cb6e5b89ec Make sure multiple bound events have their namespaces and data maintained. Fixes #3549. --- diff --git a/src/event.js b/src/event.js index 9873185..8ec1d4f 100644 --- a/src/event.js +++ b/src/event.js @@ -71,19 +71,28 @@ jQuery.event = { // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = types.split( /\s+/ ); - var type, i=0; + + var type, i = 0; + while ( (type = types[ i++ ]) ) { // Namespaced event handlers var namespaces = type.split("."); type = namespaces.shift(); + + if ( i > 1 ) { + handler = jQuery.proxy( handler ); + + if ( data !== undefined ) { + handler.data = data; + } + } + handler.type = namespaces.slice(0).sort().join("."); // Get the current list of functions bound to this event var handlers = events[ type ], special = this.special[ type ] || {}; - - // Init the event handler queue if ( !handlers ) { handlers = events[ type ] = {}; diff --git a/test/unit/event.js b/test/unit/event.js index df01bae..30ed09e 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -37,6 +37,40 @@ test("bind(), multiple events at once", function() { equals( mouseoverCounter, 1, "bind() with multiple events at once" ); }); +test("bind(), multiple events at once and namespaces", function() { + expect(7); + + var cur, obj = {}; + + var div = jQuery("
").bind("focusin.a", function(e) { + equals( e.type, cur, "Verify right single event was fired." ); + }); + + cur = "focusin"; + div.trigger("focusin.a"); + + div = jQuery("
").bind("click mouseover", obj, function(e) { + equals( e.type, cur, "Verify right multi event was fired." ); + equals( e.data, obj, "Make sure the data came in correctly." ); + }); + + cur = "click"; + div.trigger("click"); + + cur = "mouseover"; + div.trigger("mouseover"); + + div = jQuery("
").bind("focusin.a focusout.b", function(e) { + equals( e.type, cur, "Verify right multi event was fired." ); + }); + + cur = "focusin"; + div.trigger("focusin.a"); + + cur = "focusout"; + div.trigger("focusout.b"); +}); + test("bind(), no data", function() { expect(1); var handler = function(event) {