1 var expando = "jQuery" + now(), uuid = 0, windowData = {};
\r
2 var emptyObject = {};
\r
9 data: function( elem, name, data ) {
\r
10 elem = elem == window ?
\r
14 var id = elem[ expando ], cache = jQuery.cache, thisCache;
\r
16 // Compute a unique ID for the element
\r
17 if(!id) id = elem[ expando ] = ++uuid;
\r
19 // Handle the case where there's no name immediately
\r
20 if ( !name ) { return id; }
\r
22 // Avoid generating a new cache unless none exists and we
\r
23 // want to manipulate it.
\r
25 thisCache = cache[ id ];
\r
26 else if( typeof data === "undefined" )
\r
27 thisCache = emptyObject;
\r
29 thisCache = cache[ id ] = {};
\r
31 // Prevent overriding the named cache with undefined values
\r
32 if ( data !== undefined ) thisCache[ name ] = data;
\r
34 if(name === true) return thisCache;
\r
35 else return thisCache[name];
\r
38 removeData: function( elem, name ) {
\r
39 elem = elem == window ?
\r
43 var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
\r
45 // If we want to remove a specific section of the element's data
\r
48 // Remove the section of cache data
\r
49 delete thisCache[ name ];
\r
51 // If we've removed all the data, remove the element's cache
\r
52 if( jQuery.isEmptyObject(thisCache) )
\r
53 jQuery.removeData( elem );
\r
56 // Otherwise, we want to remove all of the element's data
\r
58 // Clean up the element expando
\r
60 delete elem[ expando ];
\r
62 // IE has trouble directly removing the expando
\r
63 // but it's ok with using removeAttribute
\r
64 if ( elem.removeAttribute )
\r
65 elem.removeAttribute( expando );
\r
68 // Completely remove the data cache
\r
72 queue: function( elem, type, data ) {
\r
75 type = (type || "fx") + "queue";
\r
76 var q = jQuery.data( elem, type );
\r
78 // Speed up dequeue by getting out quickly if this is just a lookup
\r
79 if( !data ) return q || [];
\r
81 if ( !q || jQuery.isArray(data) )
\r
82 q = jQuery.data( elem, type, jQuery.makeArray(data) );
\r
89 dequeue: function( elem, type ){
\r
90 type = type || "fx";
\r
92 var queue = jQuery.queue( elem, type ), fn = queue.shift();
\r
94 // If the fx queue is dequeued, always remove the progress sentinel
\r
95 if( fn === "inprogress" ) fn = queue.shift();
\r
98 // Add a progress sentinel to prevent the fx queue from being
\r
99 // automatically dequeued
\r
100 if( type == "fx" ) queue.unshift("inprogress");
\r
102 fn.call(elem, function() { jQuery.dequeue(elem, type); });
\r
108 data: function( key, value ){
\r
109 if(typeof key === "undefined" && this.length) return jQuery.data(this[0], true);
\r
111 var parts = key.split(".");
\r
112 parts[1] = parts[1] ? "." + parts[1] : "";
\r
114 if ( value === undefined ) {
\r
115 var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
\r
117 if ( data === undefined && this.length )
\r
118 data = jQuery.data( this[0], key );
\r
120 return data === undefined && parts[1] ?
\r
121 this.data( parts[0] ) :
\r
124 return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
\r
125 jQuery.data( this, key, value );
\r
129 removeData: function( key ){
\r
130 return this.each(function(){
\r
131 jQuery.removeData( this, key );
\r
134 queue: function(type, data){
\r
135 if ( typeof type !== "string" ) {
\r
140 if ( data === undefined )
\r
141 return jQuery.queue( this[0], type );
\r
143 return this.each(function(i, elem){
\r
144 var queue = jQuery.queue( this, type, data );
\r
146 if( type == "fx" && queue[0] !== "inprogress" )
\r
147 jQuery.dequeue( this, type )
\r
150 dequeue: function(type){
\r
151 return this.each(function(){
\r
152 jQuery.dequeue( this, type );
\r
155 clearQueue: function(type){
\r
156 return this.queue( type || "fx", [] );
\r