Skip to content

Commit

Permalink
Attach data directly to plain objects, no reason to use the central j…
Browse files Browse the repository at this point in the history
…Query.cache. Fixes #6189.
  • Loading branch information
jeresig committed Feb 27, 2010
1 parent 42568db commit a49e6b6
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 13 deletions.
27 changes: 17 additions & 10 deletions src/data.js
Expand Up @@ -3,7 +3,7 @@ var expando = "jQuery" + now(), uuid = 0, windowData = {};
jQuery.extend({
cache: {},

expando:expando,
expando: expando,

// The following elements throw uncatchable exceptions if you
// attempt to add expando properties to them.
Expand All @@ -22,25 +22,29 @@ jQuery.extend({
windowData :
elem;

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

if ( !id && typeof name === "string" && data === undefined ) {
return;
}

// Get the data from the object directly
if ( !isNode ) {
cache = elem;
id = jQuery.expando;

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

// Avoid generating a new cache unless none exists and we
// want to manipulate it.
if ( typeof name === "object" ) {
elem[ expando ] = id;
thisCache = cache[ id ] = jQuery.extend(true, {}, name);
cache[ id ] = jQuery.extend(true, {}, name);

} else if ( !cache[ id ] ) {
elem[ expando ] = id;
cache[ id ] = {};
}

Expand All @@ -63,7 +67,8 @@ jQuery.extend({
windowData :
elem;

var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
var id = elem[ jQuery.expando ], cache = jQuery.cache,
isNode = elem.nodeType, thisCache = isNode ? cache[ id ] : id;

// If we want to remove a specific section of the element's data
if ( name ) {
Expand All @@ -79,15 +84,17 @@ jQuery.extend({

// Otherwise, we want to remove all of the element's data
} else {
if ( jQuery.support.deleteExpando ) {
if ( jQuery.support.deleteExpando || !isNode ) {
delete elem[ jQuery.expando ];

} else if ( elem.removeAttribute ) {
elem.removeAttribute( jQuery.expando );
}

// Completely remove the data cache
delete cache[ id ];
if ( isNode ) {
delete cache[ id ];
}
}
}
});
Expand Down
14 changes: 11 additions & 3 deletions test/unit/data.js
Expand Up @@ -18,13 +18,13 @@ test("expando", function(){
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, false, "jQuery.data did not add an entry to jQuery.cache" );

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

test("jQuery.data", function() {
expect(9);
expect(12);
var div = document.createElement("div");

ok( jQuery.data(div, "test") === undefined, "Check for no data exists" );
Expand All @@ -49,6 +49,14 @@ test("jQuery.data", function() {
jQuery.data(div, { "test": "in", "test2": "in2" });
equals( jQuery.data(div, "test"), "in", "Verify setting an object in data." );
equals( jQuery.data(div, "test2"), "in2", "Verify setting an object in data." );

var obj = {};
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." );

equals( jQuery.data( obj, "prop" ), true, "Make sure the right value is retrieved." );
});

test(".data()", function() {
Expand Down

1 comment on commit a49e6b6

@DBJDBJ
Copy link

@DBJDBJ DBJDBJ commented on a49e6b6 Mar 1, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

            isNode = elem.nodeType;

Is this robust enough ? In any case API doc should warn against { "nodeType" : "whatever" }
Ultimately there should be a method :
jQuery.isNode = function ( object ) {
return "number" === typeof object.nodeType && object.nodeType > 0 && object.nodeType < 13 ;
}
Or some more elegant implementation ... But I think we can't leave this as it is ?

DBJ

Please sign in to comment.