From 5cb1163469fb2c9cd80712cd5481b29055821022 Mon Sep 17 00:00:00 2001 From: Mr Speaker Date: Wed, 11 Nov 2009 09:46:24 -0500 Subject: [PATCH] Making sure that you can bind multiple toggles to a single element without problems. Thanks to 'Mr Speaker' for the original patch. Fixes #5274. --- src/event.js | 5 +++-- test/unit/event.js | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) 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() { -- 1.7.10.4