From 9b3768b968bc99d3422355e69e2c7c35bedf681e Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Mon, 19 Sep 2011 21:16:20 -0400 Subject: [PATCH] Landing pull request 512. 1.7 - removeData now takes space separated lists and arrays of keys - Fixes #7323. More Details: - https://github.com/jquery/jquery/pull/512 - http://bugs.jquery.com/ticket/7323 --- src/data.js | 21 +++++++++++++++++---- src/event.js | 22 ++++++++++------------ test/unit/data.js | 24 +++++++++++++++++++++++- 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/data.js b/src/data.js index 1c6d1852c..0ce3b7d66 100644 --- a/src/data.js +++ b/src/data.js @@ -133,7 +133,7 @@ jQuery.extend({ return; } - var thisCache, + var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, @@ -158,12 +158,25 @@ jQuery.extend({ if ( thisCache ) { - // Support interoperable removal of hyphenated or camelcased keys - if ( !thisCache[ name ] ) { + // Support space separated names + if ( jQuery.isArray( name ) ) { + name = name; + } else if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } } - delete thisCache[ name ]; + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed diff --git a/src/event.js b/src/event.js index 2617382ad..da787ea85 100644 --- a/src/event.js +++ b/src/event.js @@ -238,20 +238,18 @@ jQuery.event = { delete events[ type ]; } + } - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - delete elemData.events; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete for this last property we touch here - jQuery.removeData( elem, "handle", true ); + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); } }, diff --git a/test/unit/data.js b/test/unit/data.js index 4feba32c0..0e9c354db 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -434,7 +434,7 @@ test(".data(Object)", function() { }); test("jQuery.removeData", function() { - expect(6); + expect(10); var div = jQuery("#foo")[0]; jQuery.data(div, "test", "testing"); jQuery.removeData(div, "test"); @@ -445,6 +445,28 @@ test("jQuery.removeData", function() { ok( !jQuery.data(div, "test2"), "Make sure that the data property no longer exists." ); ok( !div[ jQuery.expando ], "Make sure the expando no longer exists, as well." ); + jQuery.data(div, { + test3: "testing", + test4: "testing" + }); + jQuery.removeData( div, "test3 test4" ); + ok( !jQuery.data(div, "test3") || jQuery.data(div, "test4"), "Multiple delete with spaces." ); + + jQuery.data(div, { + test3: "testing", + test4: "testing" + }); + jQuery.removeData( div, [ "test3", "test4" ] ); + ok( !jQuery.data(div, "test3") || jQuery.data(div, "test4"), "Multiple delete by array." ); + + jQuery.data(div, { + "test3 test4": "testing", + test3: "testing" + }); + jQuery.removeData( div, "test3 test4" ); + ok( !jQuery.data(div, "test3 test4"), "Multiple delete with spaces deleted key with exact name" ); + ok( jQuery.data(div, "test3"), "Left the partial matched key alone" ); + var obj = {}; jQuery.data(obj, "test", "testing"); equals( jQuery(obj).data("test"), "testing", "verify data on plain object");