-var windowData = {};
+(function( jQuery ) {
+
+var windowData = {},
+ rbrace = /^(?:\{.*\}|\[.*\])$/;
jQuery.extend({
cache: {},
// 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;
}
elem;
var id = elem[ jQuery.expando ], cache = jQuery.cache, thisCache,
- isNode = elem.nodeType;
+ isNode = elem.nodeType,
+ store;
if ( !id && typeof name === "string" && data === undefined ) {
return;
// 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(cache[ id ], name);
cache[ id ] = function() {
- return jQuery.extend(true, {}, name);
- }
+ return store;
+ };
}
} else if ( !cache[ id ] ) {
if ( isNode ) {
cache[ id ] = {};
+
} else {
- var store = {};
+ store = {};
cache[ id ] = function() {
return store;
- }
+ };
}
}
- thisCache = cache[ id ];
- if ( !isNode ) {
- thisCache = thisCache();
- }
+ thisCache = isNode ? cache[ id ] : cache[ id ]();
// Prevent overriding the named cache with undefined values
if ( data !== undefined ) {
},
removeData: function( elem, name ) {
- if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+ if ( !jQuery.acceptData( elem ) ) {
return;
}
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() {
if ( value === undefined ) {
var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+ // Try to fetch any internally stored data first
if ( data === undefined && this.length ) {
data = jQuery.data( this[0], key );
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && this[0].nodeType === 1 ) {
+ data = this[0].getAttribute( "data-" + key );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ !jQuery.isNaN( data ) ? parseFloat( data ) :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ } else {
+ data = undefined;
+ }
+ }
}
+
return data === undefined && parts[1] ?
this.data( parts[0] ) :
data;
+
} else {
- return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
+ return this.each(function() {
+ var $this = jQuery( this ), args = [ parts[0], value ];
+
+ $this.triggerHandler( "setData" + parts[1] + "!", args );
jQuery.data( this, key, value );
- jQuery.event.trigger( "changeData" + parts[1] + "!", [parts[0], value], this );
+ $this.triggerHandler( "changeData" + parts[1] + "!", args );
});
}
},
});
}
});
+
+})( jQuery );