annotate default/node_modules/jquery/src/data.js @ 0:1d038bc9b3d2 default tip

Up:default
author Liny <dev@neowd.com>
date Sat, 31 May 2025 09:21:51 +0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1 define( [
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2 "./core",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
3 "./core/access",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
4 "./core/camelCase",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
5 "./data/var/dataPriv",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
6 "./data/var/dataUser"
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
7 ], function( jQuery, access, camelCase, dataPriv, dataUser ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
8
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
9 "use strict";
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
10
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
11 // Implementation Summary
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
12 //
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
13 // 1. Enforce API surface and semantic compatibility with 1.9.x branch
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
14 // 2. Improve the module's maintainability by reducing the storage
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
15 // paths to a single mechanism.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
16 // 3. Use the same single mechanism to support "private" and "user" data.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
17 // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
18 // 5. Avoid exposing implementation details on user objects (eg. expando properties)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
19 // 6. Provide a clear path for implementation upgrade to WeakMap in 2014
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
20
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
21 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
22 rmultiDash = /[A-Z]/g;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
23
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
24 function getData( data ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
25 if ( data === "true" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
26 return true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
27 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
28
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
29 if ( data === "false" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
30 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
31 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
32
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
33 if ( data === "null" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
34 return null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
35 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
36
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
37 // Only convert to a number if it doesn't change the string
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
38 if ( data === +data + "" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
39 return +data;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
40 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
41
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
42 if ( rbrace.test( data ) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
43 return JSON.parse( data );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
44 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
45
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
46 return data;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
47 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
48
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
49 function dataAttr( elem, key, data ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
50 var name;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
51
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
52 // If nothing was found internally, try to fetch any
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
53 // data from the HTML5 data-* attribute
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
54 if ( data === undefined && elem.nodeType === 1 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
55 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
56 data = elem.getAttribute( name );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
57
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
58 if ( typeof data === "string" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
59 try {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
60 data = getData( data );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
61 } catch ( e ) {}
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
62
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
63 // Make sure we set the data so it isn't changed later
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
64 dataUser.set( elem, key, data );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
65 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
66 data = undefined;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
67 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
68 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
69 return data;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
70 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
71
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
72 jQuery.extend( {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
73 hasData: function( elem ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
74 return dataUser.hasData( elem ) || dataPriv.hasData( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
75 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
76
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
77 data: function( elem, name, data ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
78 return dataUser.access( elem, name, data );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
79 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
80
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
81 removeData: function( elem, name ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
82 dataUser.remove( elem, name );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
83 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
84
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
85 // TODO: Now that all calls to _data and _removeData have been replaced
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
86 // with direct calls to dataPriv methods, these can be deprecated.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
87 _data: function( elem, name, data ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
88 return dataPriv.access( elem, name, data );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
89 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
90
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
91 _removeData: function( elem, name ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
92 dataPriv.remove( elem, name );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
93 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
94 } );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
95
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
96 jQuery.fn.extend( {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
97 data: function( key, value ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
98 var i, name, data,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
99 elem = this[ 0 ],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
100 attrs = elem && elem.attributes;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
101
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
102 // Gets all values
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
103 if ( key === undefined ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
104 if ( this.length ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
105 data = dataUser.get( elem );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
106
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
107 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
108 i = attrs.length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
109 while ( i-- ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
110
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
111 // Support: IE 11 only
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
112 // The attrs elements can be null (#14894)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
113 if ( attrs[ i ] ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
114 name = attrs[ i ].name;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
115 if ( name.indexOf( "data-" ) === 0 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
116 name = camelCase( name.slice( 5 ) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
117 dataAttr( elem, name, data[ name ] );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
118 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
119 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
120 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
121 dataPriv.set( elem, "hasDataAttrs", true );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
122 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
123 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
124
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
125 return data;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
126 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
127
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
128 // Sets multiple values
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
129 if ( typeof key === "object" ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
130 return this.each( function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
131 dataUser.set( this, key );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
132 } );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
133 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
134
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
135 return access( this, function( value ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
136 var data;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
137
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
138 // The calling jQuery object (element matches) is not empty
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
139 // (and therefore has an element appears at this[ 0 ]) and the
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
140 // `value` parameter was not undefined. An empty jQuery object
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
141 // will result in `undefined` for elem = this[ 0 ] which will
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
142 // throw an exception if an attempt to read a data cache is made.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
143 if ( elem && value === undefined ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
144
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
145 // Attempt to get data from the cache
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
146 // The key will always be camelCased in Data
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
147 data = dataUser.get( elem, key );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
148 if ( data !== undefined ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
149 return data;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
150 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
151
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
152 // Attempt to "discover" the data in
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
153 // HTML5 custom data-* attrs
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
154 data = dataAttr( elem, key );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
155 if ( data !== undefined ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
156 return data;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
157 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
158
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
159 // We tried really hard, but the data doesn't exist.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
160 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
161 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
162
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
163 // Set the data...
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
164 this.each( function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
165
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
166 // We always store the camelCased key
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
167 dataUser.set( this, key, value );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
168 } );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
169 }, null, value, arguments.length > 1, null, true );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
170 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
171
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
172 removeData: function( key ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
173 return this.each( function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
174 dataUser.remove( this, key );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
175 } );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
176 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
177 } );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
178
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
179 return jQuery;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
180 } );