From d3825ef41b82a220e6d116c33514c8de03d81da2 Mon Sep 17 00:00:00 2001
From: Jared Grippe <[email protected]>
Date: Mon, 1 Feb 2010 16:05:56 -0800
Subject: [PATCH] added 'object as event/fn pairs' support to delegate
---
src/event.js | 7 ++++++-
test/unit/event.js | 24 ++++++++++++++++++++++--
2 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/src/event.js b/src/event.js
index f6b3d31..c790c0f 100644
a
|
b
|
jQuery.fn.extend({ |
868 | 868 | }, |
869 | 869 | |
870 | 870 | delegate: function( selector, types, data, fn ) { |
871 | | return this.live( types, data, fn, selector ); |
| 871 | if (jQuery.isPlainObject(types)){ |
| 872 | for (var type in types) this.live( type, undefined, types[type], selector ); |
| 873 | }else{ |
| 874 | this.live( types, data, fn, selector ); |
| 875 | } |
| 876 | return this; |
872 | 877 | }, |
873 | 878 | |
874 | 879 | undelegate: function( selector, types, fn ) { |
diff --git a/test/unit/event.js b/test/unit/event.js
index fbb156f..4ad1ff1 100644
a
|
b
|
test("live with submit", function() { |
1126 | 1126 | }); |
1127 | 1127 | |
1128 | 1128 | test(".delegate()/.undelegate()", function() { |
1129 | | expect(65); |
| 1129 | expect(81); |
1130 | 1130 | |
1131 | | var submit = 0, div = 0, livea = 0, liveb = 0; |
| 1131 | var submit = div = livea = liveb = livec = lived = 0; |
1132 | 1132 | |
1133 | 1133 | jQuery("#body").delegate("div", "submit", function(){ submit++; return false; }); |
1134 | 1134 | jQuery("#body").delegate("div", "click", function(){ div++; }); |
1135 | 1135 | jQuery("#body").delegate("div#nothiddendiv", "click", function(){ livea++; }); |
1136 | 1136 | jQuery("#body").delegate("div#nothiddendivchild", "click", function(){ liveb++; }); |
| 1137 | jQuery("#body").delegate("div#nothiddendivchild", { |
| 1138 | click: function(){ livec++; }, |
| 1139 | 'click hover': function(){ lived++; } |
| 1140 | }); |
1137 | 1141 | |
1138 | 1142 | // Nothing should trigger on the body |
1139 | 1143 | jQuery("body").trigger("click"); |
… |
… |
test(".delegate()/.undelegate()", function() { |
1141 | 1145 | equals( div, 0, "Click on body" ); |
1142 | 1146 | equals( livea, 0, "Click on body" ); |
1143 | 1147 | equals( liveb, 0, "Click on body" ); |
| 1148 | equals( livec, 0, "Click on body" ); |
| 1149 | equals( lived, 0, "Click on body" ); |
1144 | 1150 | |
1145 | 1151 | // This should trigger two events |
1146 | 1152 | jQuery("div#nothiddendiv").trigger("click"); |
… |
… |
test(".delegate()/.undelegate()", function() { |
1148 | 1154 | equals( div, 1, "Click on div" ); |
1149 | 1155 | equals( livea, 1, "Click on div" ); |
1150 | 1156 | equals( liveb, 0, "Click on div" ); |
| 1157 | equals( livec, 0, "Click on body" ); |
| 1158 | equals( lived, 0, "Click on body" ); |
1151 | 1159 | |
1152 | 1160 | // This should trigger three events (w/ bubbling) |
1153 | 1161 | jQuery("div#nothiddendivchild").trigger("click"); |
… |
… |
test(".delegate()/.undelegate()", function() { |
1155 | 1163 | equals( div, 2, "Click on inner div" ); |
1156 | 1164 | equals( livea, 2, "Click on inner div" ); |
1157 | 1165 | equals( liveb, 1, "Click on inner div" ); |
| 1166 | equals( livec, 1, "Click on body" ); |
| 1167 | equals( lived, 1, "Click on body" ); |
1158 | 1168 | |
1159 | 1169 | // This should trigger one submit |
1160 | 1170 | jQuery("div#nothiddendivchild").trigger("submit"); |
… |
… |
test(".delegate()/.undelegate()", function() { |
1162 | 1172 | equals( div, 2, "Submit on div" ); |
1163 | 1173 | equals( livea, 2, "Submit on div" ); |
1164 | 1174 | equals( liveb, 1, "Submit on div" ); |
| 1175 | equals( livec, 1, "Click on body" ); |
| 1176 | equals( lived, 1, "Click on body" ); |
1165 | 1177 | |
1166 | 1178 | // Make sure no other events were removed in the process |
1167 | 1179 | jQuery("div#nothiddendivchild").trigger("click"); |
… |
… |
test(".delegate()/.undelegate()", function() { |
1169 | 1181 | equals( div, 3, "undelegate Click on inner div" ); |
1170 | 1182 | equals( livea, 3, "undelegate Click on inner div" ); |
1171 | 1183 | equals( liveb, 2, "undelegate Click on inner div" ); |
| 1184 | equals( livec, 2, "undelegate Click on inner div" ); |
| 1185 | equals( lived, 2, "undelegate Click on inner div" ); |
1172 | 1186 | |
1173 | 1187 | // Now make sure that the removal works |
1174 | 1188 | jQuery("#body").undelegate("div#nothiddendivchild", "click"); |
… |
… |
test(".delegate()/.undelegate()", function() { |
1177 | 1191 | equals( div, 4, "undelegate Click on inner div" ); |
1178 | 1192 | equals( livea, 4, "undelegate Click on inner div" ); |
1179 | 1193 | equals( liveb, 2, "undelegate Click on inner div" ); |
| 1194 | equals( livec, 2, "undelegate Click on inner div" ); |
| 1195 | equals( lived, 2, "undelegate Click on inner div" ); |
1180 | 1196 | |
1181 | 1197 | // Make sure that the click wasn't removed too early |
1182 | 1198 | jQuery("div#nothiddendiv").trigger("click"); |
… |
… |
test(".delegate()/.undelegate()", function() { |
1184 | 1200 | equals( div, 5, "undelegate Click on inner div" ); |
1185 | 1201 | equals( livea, 5, "undelegate Click on inner div" ); |
1186 | 1202 | equals( liveb, 2, "undelegate Click on inner div" ); |
| 1203 | equals( livec, 2, "undelegate Click on inner div" ); |
| 1204 | equals( lived, 2, "undelegate Click on inner div" ); |
1187 | 1205 | |
1188 | 1206 | // Make sure that stopPropgation doesn't stop live events |
1189 | 1207 | jQuery("#body").delegate("div#nothiddendivchild", "click", function(e){ liveb++; e.stopPropagation(); }); |
… |
… |
test(".delegate()/.undelegate()", function() { |
1192 | 1210 | equals( div, 6, "stopPropagation Click on inner div" ); |
1193 | 1211 | equals( livea, 6, "stopPropagation Click on inner div" ); |
1194 | 1212 | equals( liveb, 3, "stopPropagation Click on inner div" ); |
| 1213 | equals( livec, 2, "stopPropagation Click on inner div" ); |
| 1214 | equals( lived, 2, "stopPropagation Click on inner div" ); |
1195 | 1215 | |
1196 | 1216 | // Make sure click events only fire with primary click |
1197 | 1217 | var event = jQuery.Event("click"); |