diff --git a/src/data.js b/src/data.js index a4c4e4b6da..dd8fe8c164 100644 --- a/src/data.js +++ b/src/data.js @@ -46,13 +46,30 @@ jQuery.extend({ // Avoid generating a new cache unless none exists and we // want to manipulate it. if ( typeof name === "object" ) { - cache[ id ] = jQuery.extend(true, {}, name); + if ( isNode ) { + cache[ id ] = jQuery.extend(true, {}, name); + } else { + cache[ id ] = function() { + return jQuery.extend(true, {}, name); + } + } } else if ( !cache[ id ] ) { - cache[ id ] = {}; + if ( isNode ) { + cache[ id ] = {}; + } else { + var store = {}; + cache[ id ] = function() { + return store; + } + } + } thisCache = cache[ id ]; + if ( !isNode ) { + thisCache = thisCache(); + } // Prevent overriding the named cache with undefined values if ( data !== undefined ) { @@ -71,8 +88,12 @@ jQuery.extend({ windowData : elem; - var id = elem[ jQuery.expando ], cache = jQuery.cache, - isNode = elem.nodeType, thisCache = isNode ? cache[ id ] : id; + var isNode = elem.nodeType, + id = elem[ jQuery.expando ], cache = jQuery.cache; + if ( id && !isNode ) { + id = id(); + } + var thisCache = cache[ id ]; // If we want to remove a specific section of the element's data if ( name ) { diff --git a/test/unit/data.js b/test/unit/data.js index 11bce4d141..2f13612b5e 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -1,13 +1,14 @@ module("data"); test("expando", function(){ - expect(6); + expect(7); equals("expando" in jQuery, true, "jQuery is exposing the expando"); var obj = {}; jQuery.data(obj); equals( jQuery.expando in obj, true, "jQuery.data adds an expando to the object" ); + equals( typeof obj[jQuery.expando], "function", "jQuery.data adds an expando to the object as a function" ); obj = {}; jQuery.data(obj, 'test'); @@ -17,7 +18,7 @@ test("expando", function(){ jQuery.data(obj, "foo", "bar"); equals( jQuery.expando in obj, true, "jQuery.data added an expando to the object" ); - var id = obj[jQuery.expando]; + var id = obj[jQuery.expando](); equals( id in jQuery.cache, false, "jQuery.data did not add an entry to jQuery.cache" ); equals( id.foo, "bar", "jQuery.data worked correctly" ); @@ -54,7 +55,7 @@ test("jQuery.data", function() { jQuery.data( obj, "prop", true ); ok( obj[ jQuery.expando ], "Data is being stored on the object." ); - ok( obj[ jQuery.expando ].prop, "Data is being stored on the object." ); + ok( obj[ jQuery.expando ]().prop, "Data is being stored on the object." ); equals( jQuery.data( obj, "prop" ), true, "Make sure the right value is retrieved." ); });