X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fdata.js;h=448e243931bffaf60340cd7d628b046ae286b9a3;hb=76db8a98220b6d76e98536b9578919bfb70048ed;hp=abe46891ddf8d72038a99673e126911e46a02baf;hpb=1f8a5e4bbc49c244051101765c46bd8f35e2aa32;p=jquery.git diff --git a/src/data.js b/src/data.js index abe4689..448e243 100644 --- a/src/data.js +++ b/src/data.js @@ -1,8 +1,8 @@ (function( jQuery ) { var windowData = {}, - rnum = /^-?\d+(?:\.\d+)$/, - rbrace = /^(?:{.*}|\[.*\])$/; + rbrace = /^(?:\{.*\}|\[.*\])$/, + rdigit = /\d/; jQuery.extend({ cache: {}, @@ -17,12 +17,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 +53,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 +65,7 @@ jQuery.extend({ } else if ( !cache[ id ] ) { if ( isNode ) { cache[ id ] = {}; + } else { store = {}; cache[ id ] = function() { @@ -83,7 +86,7 @@ jQuery.extend({ }, removeData: function( elem, name ) { - if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + if ( !jQuery.acceptData( elem ) ) { return; } @@ -124,13 +127,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 +174,7 @@ jQuery.fn.extend({ data = data === "true" ? true : data === "false" ? false : data === "null" ? null : - rnum.test( data ) ? parseFloat( data ) : + rdigit.test( data ) && !isNaN( data ) ? parseFloat( data ) : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {}