Make sure that opacity is being reset properly on a show animation. Additionally...
[jquery.git] / src / data.js
index dc08a56..43ab595 100644 (file)
@@ -1,8 +1,7 @@
 (function( jQuery ) {
 
 var windowData = {},
-       rnum = /^-?\d+(?:\.\d+)?(?:E\d+)?$/,
-       rbrace = /^(?:{.*}|\[.*\])$/;
+       rbrace = /^(?:\{.*\}|\[.*\])$/;
 
 jQuery.extend({
        cache: {},
@@ -17,12 +16,13 @@ jQuery.extend({
        // attempt to add expando properties to them.
        noData: {
                "embed": true,
-               "object": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
                "applet": true
        },
 
        data: function( elem, name, data ) {
-               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+               if ( !jQuery.acceptData( elem ) ) {
                        return;
                }
 
@@ -52,9 +52,10 @@ jQuery.extend({
                // want to manipulate it.
                if ( typeof name === "object" ) {
                        if ( isNode ) {
-                               cache[ id ] = jQuery.extend(true, {}, name);
+                               cache[ id ] = jQuery.extend(cache[ id ], name);
+
                        } else {
-                               store = jQuery.extend(true, {}, name);
+                               store = jQuery.extend(cache[ id ], name);
                                cache[ id ] = function() {
                                        return store;
                                };
@@ -63,6 +64,7 @@ jQuery.extend({
                } else if ( !cache[ id ] ) {
                        if ( isNode ) {
                                cache[ id ] = {};
+
                        } else {
                                store = {};
                                cache[ id ] = function() {
@@ -83,7 +85,7 @@ jQuery.extend({
        },
 
        removeData: function( elem, name ) {
-               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+               if ( !jQuery.acceptData( elem ) ) {
                        return;
                }
 
@@ -124,13 +126,26 @@ jQuery.extend({
                                delete cache[ id ];
                        }
                }
+       },
+
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               if ( elem.nodeName ) {
+                       match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+                       if ( match ) {
+                               return !(match === true || elem.getAttribute("classid") !== match);
+                       }
+               }
+
+               return true;
        }
 });
 
 jQuery.fn.extend({
        data: function( key, value ) {
-               if ( typeof key === "undefined" && this.length ) {
-                       return jQuery.data( this[0] );
+               if ( typeof key === "undefined" ) {
+                       return this.length ? jQuery.data( this[0] ) : null;
 
                } else if ( typeof key === "object" ) {
                        return this.each(function() {
@@ -158,7 +173,7 @@ jQuery.fn.extend({
                                                        data = data === "true" ? true :
                                                                data === "false" ? false :
                                                                data === "null" ? null :
-                                                               rnum.test( data ) ? parseFloat( data ) :
+                                                               !jQuery.isNaN( data ) ? parseFloat( data ) :
                                                                rbrace.test( data ) ? jQuery.parseJSON( data ) :
                                                                data;
                                                } catch( e ) {}