From: Mr Speaker Date: Wed, 11 Nov 2009 14:46:24 +0000 (-0500) Subject: Making sure that you can bind multiple toggles to a single element without problems... X-Git-Url: http://git.asbjorn.biz/?p=jquery.git;a=commitdiff_plain;h=5cb1163469fb2c9cd80712cd5481b29055821022 Making sure that you can bind multiple toggles to a single element without problems. Thanks to 'Mr Speaker' for the original patch. Fixes #5274. --- diff --git a/src/event.js b/src/event.js index 7cfb535..e2087cc 100644 --- a/src/event.js +++ b/src/event.js @@ -693,13 +693,14 @@ jQuery.fn.extend({ return this.click( jQuery.event.proxy( fn, function( event ) { // Figure out which function to execute - this.lastToggle = ( this.lastToggle || 0 ) % i; + var lastToggle = ( jQuery.data( this, 'lastToggle' + fn.guid ) || 0 ) % i; + jQuery.data( this, 'lastToggle' + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function - return args[ this.lastToggle++ ].apply( this, arguments ) || false; + return args[ lastToggle ].apply( this, arguments ) || false; })); }, diff --git a/test/unit/event.js b/test/unit/event.js index d2da8e2..2b4d8e5 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -532,7 +532,7 @@ test("jQuery.Event.currentTarget", function(){ }); test("toggle(Function, Function, ...)", function() { - expect(11); + expect(16); var count = 0, fn1 = function(e) { count++; }, @@ -585,6 +585,22 @@ test("toggle(Function, Function, ...)", function() { $div.unbind('click',fns[0]); var data = jQuery.data( $div[0], 'events' ); ok( !data, "Unbinding one function from toggle unbinds them all"); + + // Test Multi-Toggles + var a = [], b = []; + $div = jQuery("
"); + $div.toggle(function(){ a.push(1); }, function(){ a.push(2); }); + $div.click(); + same( a, [1], "Check that a click worked." ); + + $div.toggle(function(){ b.push(1); }, function(){ b.push(2); }); + $div.click(); + same( a, [1,2], "Check that a click worked with a second toggle." ); + same( b, [1], "Check that a click worked with a second toggle." ); + + $div.click(); + same( a, [1,2,1], "Check that a click worked with a second toggle, second click." ); + same( b, [1,2], "Check that a click worked with a second toggle, second click." ); }); test(".live()/.die()", function() {