X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fdata.js;h=500f7ea43f0508c41410e28eff2b661b85dd6991;hb=93be758de94b2d4a76fca217465c9e09b613cedd;hp=9cc76c603ef5402cae63f42a64fbd3c1758e9cf7;hpb=190812c3be99bde536d373b6b6ab65cfe053a532;p=jquery.git diff --git a/src/data.js b/src/data.js index 9cc76c6..500f7ea 100644 --- a/src/data.js +++ b/src/data.js @@ -1,31 +1,45 @@ var expando = "jQuery" + now(), uuid = 0, windowData = {}; +var emptyObject = {}; jQuery.extend({ cache: {}, + + expando:expando, data: function( elem, name, data ) { elem = elem == window ? windowData : elem; - var id = elem[ expando ], cache = jQuery.cache; + var id = elem[ expando ], cache = jQuery.cache, thisCache; - // Compute a unique ID for the element - if(!id) id = elem[ expando ] = ++uuid; - - // Only generate the data cache if we're - // trying to access or manipulate it - if ( name && !cache[ id ] ) - cache[ id ] = {}; + // Handle the case where there's no name immediately + if ( !name && !id ) { + return null; + } - var thisCache = cache[ id ]; + // Compute a unique ID for the element + if ( !id ) { + id = ++uuid; + } + // Avoid generating a new cache unless none exists and we + // want to manipulate it. + if ( cache[ id ] ) { + thisCache = cache[ id ]; + } else if ( typeof data === "undefined" ) { + thisCache = emptyObject; + } else { + thisCache = cache[ id ] = {}; + } + // Prevent overriding the named cache with undefined values - if ( data !== undefined ) thisCache[ name ] = data; - - if(name === true) return thisCache - else if(name) return thisCache[name] - else return id + if ( data !== undefined ) { + elem[ expando ] = id; + thisCache[ name ] = data; + } + + return name ? thisCache[ name ] : thisCache; }, removeData: function( elem, name ) { @@ -42,8 +56,9 @@ jQuery.extend({ delete thisCache[ name ]; // If we've removed all the data, remove the element's cache - if( jQuery.isEmptyObject(thisCache) ) + if ( jQuery.isEmptyObject(thisCache) ) { jQuery.removeData( elem ); + } } // Otherwise, we want to remove all of the element's data @@ -51,48 +66,59 @@ jQuery.extend({ // Clean up the element expando try { delete elem[ expando ]; - } catch(e){ + } catch( e ) { // IE has trouble directly removing the expando // but it's ok with using removeAttribute - if ( elem.removeAttribute ) + if ( elem.removeAttribute ) { elem.removeAttribute( expando ); + } } // Completely remove the data cache delete cache[ id ]; } }, + queue: function( elem, type, data ) { - if ( elem ){ + if( !elem ) return; - type = (type || "fx") + "queue"; + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type ); - var q = jQuery.data( elem, type ); + // Speed up dequeue by getting out quickly if this is just a lookup + if( !data ) return q || []; - if ( !q || jQuery.isArray(data) ) - q = jQuery.data( elem, type, jQuery.makeArray(data) ); - else if( data ) - q.push( data ); + if ( !q || jQuery.isArray(data) ) + q = jQuery.data( elem, type, jQuery.makeArray(data) ); + else + q.push( data ); - } return q; }, dequeue: function( elem, type ){ - var queue = jQuery.queue( elem, type ), - fn = queue.shift(); + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if( fn === "inprogress" ) fn = queue.shift(); - if( !type || type === "fx" ) - fn = queue[0]; + if( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if( type == "fx" ) queue.unshift("inprogress"); - if( fn !== undefined ) - fn.call(elem, function() { jQuery(elem).dequeue(type); }); + fn.call(elem, function() { jQuery.dequeue(elem, type); }); + } } }); jQuery.fn.extend({ data: function( key, value ){ - if(typeof key === "undefined" && this.length) return jQuery.data(this[0], true); + if ( typeof key === "undefined" && this.length ) { + return jQuery.data( this[0] ); + } var parts = key.split("."); parts[1] = parts[1] ? "." + parts[1] : ""; @@ -129,8 +155,8 @@ jQuery.fn.extend({ return this.each(function(i, elem){ var queue = jQuery.queue( this, type, data ); - if( type == "fx" && queue.length == 1 ) - queue[0].call(this, function() { jQuery(elem).dequeue(type); }); + if( type == "fx" && queue[0] !== "inprogress" ) + jQuery.dequeue( this, type ) }); }, dequeue: function(type){ @@ -141,4 +167,4 @@ jQuery.fn.extend({ clearQueue: function(type){ return this.queue( type || "fx", [] ); } -}); \ No newline at end of file +});