1- var windowData = { } ;
1+ ( function ( jQuery ) {
2+
3+ var windowData = { } ,
4+ rbrace = / ^ (?: \{ .* \} | \[ .* \] ) $ / ;
25
36jQuery . extend ( {
47 cache : { } ,
@@ -13,54 +16,65 @@ jQuery.extend({
1316 // attempt to add expando properties to them.
1417 noData : {
1518 "embed" : true ,
16- "object" : true ,
19+ // Ban all objects except for Flash (which handle expandos)
20+ "object" : "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ,
1721 "applet" : true
1822 } ,
1923
2024 data : function ( elem , name , data ) {
21- if ( elem . nodeName && jQuery . noData [ elem . nodeName . toLowerCase ( ) ] ) {
25+ if ( ! jQuery . acceptData ( elem ) ) {
2226 return ;
2327 }
2428
2529 elem = elem == window ?
2630 windowData :
2731 elem ;
2832
29- var isNode = elem . nodeType ,
30- id = isNode ? elem [ jQuery . expando ] : null ,
31- cache = jQuery . cache , thisCache ;
33+ var id = elem [ jQuery . expando ] , cache = jQuery . cache , thisCache ,
34+ isNode = elem . nodeType ,
35+ store ;
3236
33- if ( isNode && ! id && typeof name === "string" && data === undefined ) {
37+ if ( ! id && typeof name === "string" && data === undefined ) {
3438 return ;
3539 }
3640
37- if ( isNode && ! id ) {
38- // Compute a unique ID for the element
41+ // Get the data from the object directly
42+ if ( ! isNode ) {
43+ cache = elem ;
44+ id = jQuery . expando ;
45+
46+ // Compute a unique ID for the element
47+ } else if ( ! id ) {
3948 elem [ jQuery . expando ] = id = ++ jQuery . uuid ;
4049 }
4150
4251 // Avoid generating a new cache unless none exists and we
4352 // want to manipulate it.
4453 if ( typeof name === "object" ) {
4554 if ( isNode ) {
46- cache [ id ] = jQuery . extend ( true , { } , name ) ;
55+ cache [ id ] = jQuery . extend ( cache [ id ] , name ) ;
56+
4757 } else {
48- jQuery . extend ( true , elem , name ) ;
58+ store = jQuery . extend ( cache [ id ] , name ) ;
59+ cache [ id ] = function ( ) {
60+ return store ;
61+ } ;
4962 }
5063
51- } else if ( isNode && ! cache [ id ] ) {
64+ } else if ( ! cache [ id ] ) {
5265 if ( isNode ) {
5366 cache [ id ] = { } ;
67+
5468 } else {
55- var store = { } ;
69+ store = { } ;
5670 cache [ id ] = function ( ) {
5771 return store ;
5872 } ;
5973 }
6074
6175 }
6276
63- thisCache = isNode ? cache [ id ] : elem ;
77+ thisCache = isNode ? cache [ id ] : cache [ id ] ( ) ;
6478
6579 // Prevent overriding the named cache with undefined values
6680 if ( data !== undefined ) {
@@ -71,7 +85,7 @@ jQuery.extend({
7185 } ,
7286
7387 removeData : function ( elem , name ) {
74- if ( elem . nodeName && jQuery . noData [ elem . nodeName . toLowerCase ( ) ] ) {
88+ if ( ! jQuery . acceptData ( elem ) ) {
7589 return ;
7690 }
7791
@@ -80,20 +94,27 @@ jQuery.extend({
8094 elem ;
8195
8296 var isNode = elem . nodeType ,
83- id = isNode ? elem [ jQuery . expando ] : elem ,
84- cache = jQuery . cache ,
85- thisCache = isNode ? cache [ id ] : id ;
97+ id = elem [ jQuery . expando ] , cache = jQuery . cache ;
98+ if ( id && ! isNode ) {
99+ id = id ( ) ;
100+ }
101+ var thisCache = cache [ id ] ;
86102
87103 // If we want to remove a specific section of the element's data
88104 if ( name ) {
89105 if ( thisCache ) {
90106 // Remove the section of cache data
91107 delete thisCache [ name ] ;
108+
109+ // If we've removed all the data, remove the element's cache
110+ if ( jQuery . isEmptyObject ( thisCache ) ) {
111+ jQuery . removeData ( elem ) ;
112+ }
92113 }
93114
94115 // Otherwise, we want to remove all of the element's data
95116 } else {
96- if ( isNode && jQuery . support . deleteExpando ) {
117+ if ( jQuery . support . deleteExpando || ! isNode ) {
97118 delete elem [ jQuery . expando ] ;
98119
99120 } else if ( elem . removeAttribute ) {
@@ -103,20 +124,28 @@ jQuery.extend({
103124 // Completely remove the data cache
104125 if ( isNode ) {
105126 delete cache [ id ] ;
106- } else {
107- // remove all fields from the object
108- for ( var n in elem ) {
109- delete elem [ n ] ;
110- }
111127 }
112128 }
129+ } ,
130+
131+ // A method for determining if a DOM node can handle the data expando
132+ acceptData : function ( elem ) {
133+ if ( elem . nodeName ) {
134+ match = jQuery . noData [ elem . nodeName . toLowerCase ( ) ] ;
135+
136+ if ( match ) {
137+ return ! ( match === true || elem . getAttribute ( "classid" ) !== match ) ;
138+ }
139+ }
140+
141+ return true ;
113142 }
114143} ) ;
115144
116145jQuery . fn . extend ( {
117146 data : function ( key , value ) {
118- if ( typeof key === "undefined" && this . length ) {
119- return jQuery . data ( this [ 0 ] ) ;
147+ if ( typeof key === "undefined" ) {
148+ return this . length ? jQuery . data ( this [ 0 ] ) : null ;
120149
121150 } else if ( typeof key === "object" ) {
122151 return this . each ( function ( ) {
@@ -130,16 +159,42 @@ jQuery.fn.extend({
130159 if ( value === undefined ) {
131160 var data = this . triggerHandler ( "getData" + parts [ 1 ] + "!" , [ parts [ 0 ] ] ) ;
132161
162+ // Try to fetch any internally stored data first
133163 if ( data === undefined && this . length ) {
134164 data = jQuery . data ( this [ 0 ] , key ) ;
165+
166+ // If nothing was found internally, try to fetch any
167+ // data from the HTML5 data-* attribute
168+ if ( data === undefined && this [ 0 ] . nodeType === 1 ) {
169+ data = this [ 0 ] . getAttribute ( "data-" + key ) ;
170+
171+ if ( typeof data === "string" ) {
172+ try {
173+ data = data === "true" ? true :
174+ data === "false" ? false :
175+ data === "null" ? null :
176+ ! jQuery . isNaN ( data ) ? parseFloat ( data ) :
177+ rbrace . test ( data ) ? jQuery . parseJSON ( data ) :
178+ data ;
179+ } catch ( e ) { }
180+
181+ } else {
182+ data = undefined ;
183+ }
184+ }
135185 }
186+
136187 return data === undefined && parts [ 1 ] ?
137188 this . data ( parts [ 0 ] ) :
138189 data ;
190+
139191 } else {
140- return this . trigger ( "setData" + parts [ 1 ] + "!" , [ parts [ 0 ] , value ] ) . each ( function ( ) {
192+ return this . each ( function ( ) {
193+ var $this = jQuery ( this ) , args = [ parts [ 0 ] , value ] ;
194+
195+ $this . triggerHandler ( "setData" + parts [ 1 ] + "!" , args ) ;
141196 jQuery . data ( this , key , value ) ;
142- jQuery . event . trigger ( "changeData" + parts [ 1 ] + "!" , [ parts [ 0 ] , value ] , this ) ;
197+ $this . triggerHandler ( "changeData" + parts [ 1 ] + "!" , args ) ;
143198 } ) ;
144199 }
145200 } ,
@@ -150,3 +205,5 @@ jQuery.fn.extend({
150205 } ) ;
151206 }
152207} ) ;
208+
209+ } ) ( jQuery ) ;
0 commit comments