Skip to content
Permalink
Browse files

data should not add expando unless actually adding data

  • Loading branch information
brandonaaron committed Sep 15, 2009
1 parent 24ffc39 commit 97e134fe80a734b97170bf43c9459511f4e165c7
Showing with 45 additions and 20 deletions.
  1. +24 −14 src/data.js
  2. +21 −6 test/unit/data.js
@@ -13,26 +13,33 @@ jQuery.extend({

var id = elem[ expando ], cache = jQuery.cache, thisCache;

// Compute a unique ID for the element
if(!id) id = elem[ expando ] = ++uuid;

// Handle the case where there's no name immediately
if ( !name ) { return id; }
if ( !name ) {
return id;
}

// Compute a unique ID for the element
if ( !id ) {
id = ++uuid;
}

// Avoid generating a new cache unless none exists and we
// want to manipulate it.
if( cache[ id ] )
if ( cache[ id ] ) {
thisCache = cache[ id ];
else if( typeof data === "undefined" )
} else if ( typeof data === "undefined" ) {
thisCache = emptyObject;
else
} else {
thisCache = cache[ id ] = {};
}

// Prevent overriding the named cache with undefined values
if ( data !== undefined ) thisCache[ name ] = data;

if(name === true) return thisCache;
else return thisCache[name];
if ( data !== undefined ) {
elem[ expando ] = id;
thisCache[ name ] = data;
}

return name === true ? thisCache : thisCache[ name ];
},

removeData: function( elem, name ) {
@@ -49,26 +56,29 @@ jQuery.extend({
delete thisCache[ name ];

// If we've removed all the data, remove the element's cache
if( jQuery.isEmptyObject(thisCache) )
if ( jQuery.isEmptyObject(thisCache) ) {
jQuery.removeData( elem );
}
}

// Otherwise, we want to remove all of the element's data
} else {
// Clean up the element expando
try {
delete elem[ expando ];
} catch(e){
} catch( e ) {
// IE has trouble directly removing the expando
// but it's ok with using removeAttribute
if ( elem.removeAttribute )
if ( elem.removeAttribute ) {
elem.removeAttribute( expando );
}
}

// Completely remove the data cache
delete cache[ id ];
}
},

queue: function( elem, type, data ) {
if( !elem ) return;

@@ -1,31 +1,46 @@
module("data");

test("expando", function(){
expect(4);
expect(7);

equals("expando" in jQuery, true, "jQuery is exposing the expando");

var obj = {};
jQuery.data(obj);
equals( jQuery.expando in obj, false, "jQuery.data did not add an expando to the object" );

jQuery.data(obj, true);
equals( jQuery.expando in obj, false, "jQuery.data did not add an expando to the object" );

jQuery.data(obj, 'test');
equals( jQuery.expando in obj, false, "jQuery.data did not add an expando to the object" );

jQuery.data(obj, "foo", "bar");

equals(jQuery.expando in obj, true, "jQuery.data added an expando to the object");
equals( jQuery.expando in obj, true, "jQuery.data added an expando to the object" );

var id = obj[jQuery.expando];
equals( id in jQuery.cache, true, "jQuery.data added an entry to jQuery.cache");
equals( id in jQuery.cache, true, "jQuery.data added an entry to jQuery.cache" );

equals( jQuery.cache[id].foo, "bar", "jQuery.data worked correctly");
equals( jQuery.cache[id].foo, "bar", "jQuery.data worked correctly" );
});

test("jQuery.data", function() {
expect(5);
expect(6);
var div = jQuery("#foo")[0];
equals( jQuery.data(div, "test"), undefined, "Check for no data exists" );

jQuery.data(div, "test", "success");
equals( jQuery.data(div, "test"), "success", "Check for added data" );

var data = jQuery.data(div, true);
same( data, { "test": "success" }, "Return complete data set" );

jQuery.data(div, "test", "overwritten");
equals( jQuery.data(div, "test"), "overwritten", "Check for overwritten data" );

jQuery.data(div, "test", undefined);
equals( jQuery.data(div, "test"), "overwritten", "Check that data wasn't removed");

jQuery.data(div, "test", null);
ok( jQuery.data(div, "test") === null, "Check for null data");
});

0 comments on commit 97e134f

Please sign in to comment.
You can’t perform that action at this time.