aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeresig <jeresig@gmail.com>2010-01-25 16:45:39 -0500
committerjeresig <jeresig@gmail.com>2010-01-25 16:45:39 -0500
commit0474917c9d82fa13d865282d2da2d3cb6e5b89ec (patch)
tree043248e333650a4c2fb72f52aba8ed89b754569f
parente01ff6cda1be44900b9829c718733923b71db11f (diff)
downloadjquery-0474917c9d82fa13d865282d2da2d3cb6e5b89ec.tar.gz
jquery-0474917c9d82fa13d865282d2da2d3cb6e5b89ec.zip
Make sure multiple bound events have their namespaces and data maintained. Fixes #3549.
-rw-r--r--src/event.js15
-rw-r--r--test/unit/event.js34
2 files changed, 46 insertions, 3 deletions
diff --git a/src/event.js b/src/event.js
index 987318547..8ec1d4f36 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 df01baeac..30ed09e29 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("<div/>").bind("focusin.a", function(e) {
+ equals( e.type, cur, "Verify right single event was fired." );
+ });
+
+ cur = "focusin";
+ div.trigger("focusin.a");
+
+ div = jQuery("<div/>").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("<div/>").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) {