Update $.data to use a function instead of an object when attaching to JS objects...
[jquery.git] / src / data.js
index a1abc9e..faa44f3 100644 (file)
@@ -63,12 +63,14 @@ jQuery.extend({
                }
 
                if ( !cache[ id ] ) {
-                       cache[ id ] = {};
+                       // Use a Function as the cache object instead of an Object on JS objects
+                       // as a hack to prevent JSON.stringify from serializing it (#8108)
+                       cache[ id ] = isNode ? {} : function () {};
                }
 
                // An object can be passed to jQuery.data instead of a key/value pair; this gets
                // shallow copied over onto the existing cache
-               if ( typeof name === "object" ) {
+               if ( typeof name === "object" || typeof name === "function" ) {
                        if ( pvt ) {
                                cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
                        } else {
@@ -93,6 +95,13 @@ jQuery.extend({
                        thisCache[ name ] = data;
                }
 
+               // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+               // not attempt to inspect the internal events object using jQuery.data, as this
+               // internal data object is undocumented and subject to change.
+               if ( name === "events" && !thisCache[name] ) {
+                       return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+               }
+
                return getByName ? thisCache[ name ] : thisCache;
        },