X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fdata.js;h=d03d51f2fb8cb2b4e99fb2a5ab41ca676bf8cf50;hb=a2731202917f8e90cad94ee574241d1626dc7fb6;hp=45882fda24971b49234475c809b695cec8b221de;hpb=a09dac440609ac0154b489a647cfe3b93b7d400b;p=jquery.git diff --git a/src/data.js b/src/data.js index 45882fd..d03d51f 100644 --- a/src/data.js +++ b/src/data.js @@ -2,31 +2,32 @@ var expando = "jQuery" + now(), uuid = 0, windowData = {}; jQuery.extend({ cache: {}, + + expando:expando, data: function( elem, name, data ) { elem = elem == window ? windowData : elem; - var id = elem[ expando ]; + var id = elem[ expando ], cache = jQuery.cache; // Compute a unique ID for the element - if ( !id ) - id = elem[ expando ] = ++uuid; + if(!id) id = elem[ expando ] = ++uuid; // Only generate the data cache if we're // trying to access or manipulate it - if ( name && !jQuery.cache[ id ] ) - jQuery.cache[ id ] = {}; + if ( name && !cache[ id ] ) + cache[ id ] = {}; + + var thisCache = cache[ id ]; // Prevent overriding the named cache with undefined values - if ( data !== undefined ) - jQuery.cache[ id ][ name ] = data; + if ( data !== undefined ) thisCache[ name ] = data; - // Return the named cache data, or the ID for the element - return name ? - jQuery.cache[ id ][ name ] : - id; + if(name === true) return thisCache + else if(name) return thisCache[name] + else return id }, removeData: function( elem, name ) { @@ -34,21 +35,16 @@ jQuery.extend({ windowData : elem; - var id = elem[ expando ]; + var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; // If we want to remove a specific section of the element's data if ( name ) { - if ( jQuery.cache[ id ] ) { + if ( thisCache ) { // Remove the section of cache data - delete jQuery.cache[ id ][ name ]; + delete thisCache[ name ]; // If we've removed all the data, remove the element's cache - name = ""; - - for ( name in jQuery.cache[ id ] ) - break; - - if ( !name ) + if( jQuery.isEmptyObject(thisCache) ) jQuery.removeData( elem ); } @@ -65,184 +61,48 @@ jQuery.extend({ } // Completely remove the data cache - delete jQuery.cache[ id ]; + delete cache[ id ]; } }, queue: function( elem, type, data ) { - if ( elem ){ - - type = (type || "fx") + "queue"; - - var q = jQuery.data( elem, type ); - - if ( !q || jQuery.isArray(data) ) - q = jQuery.data( elem, type, jQuery.makeArray(data) ); - else if( data ) - q.push( data ); - - } - return q; - }, - - dequeue: function( elem, type ){ - var queue = jQuery.queue( elem, type ), - fn = queue.shift(); - - if( !type || type === "fx" ) - fn = queue[0]; - - if( fn !== undefined ) - fn.call(elem); - } -}); + if( !elem ) return; -jQuery.fn.extend({ - data: function( key, value ){ - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type ); - if ( value === undefined ) { - var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + // Speed up dequeue by getting out quickly if this is just a lookup + if( !data ) return q || []; - if ( data === undefined && this.length ) - data = jQuery.data( this[0], key ); + if ( !q || jQuery.isArray(data) ) + q = jQuery.data( elem, type, jQuery.makeArray(data) ); + else + q.push( data ); - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - } else - return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ - jQuery.data( this, key, value ); - }); - }, - - removeData: function( key ){ - return this.each(function(){ - jQuery.removeData( this, key ); - }); - }, - queue: function(type, data){ - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) - return jQuery.queue( this[0], type ); - - return this.each(function(){ - var queue = jQuery.queue( this, type, data ); - - if( type == "fx" && queue.length == 1 ) - queue[0].call(this); - }); - }, - dequeue: function(type){ - return this.each(function(){ - jQuery.dequeue( this, type ); - }); - } -}); -var expando = "jQuery" + now(), uuid = 0, windowData = {}; - -jQuery.extend({ - cache: {}, - - data: function( elem, name, data ) { - elem = elem == window ? - windowData : - elem; - - var id = elem[ expando ]; - - // 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 && !jQuery.cache[ id ] ) - jQuery.cache[ id ] = {}; - - // Prevent overriding the named cache with undefined values - if ( data !== undefined ) - jQuery.cache[ id ][ name ] = data; - - // Return the named cache data, or the ID for the element - return name ? - jQuery.cache[ id ][ name ] : - id; + return q; }, - removeData: function( elem, name ) { - elem = elem == window ? - windowData : - elem; - - var id = elem[ expando ]; - - // If we want to remove a specific section of the element's data - if ( name ) { - if ( jQuery.cache[ id ] ) { - // Remove the section of cache data - delete jQuery.cache[ id ][ name ]; - - // If we've removed all the data, remove the element's cache - name = ""; + dequeue: function( elem, type ){ + type = type || "fx"; - for ( name in jQuery.cache[ id ] ) - break; + var queue = jQuery.queue( elem, type ), fn = queue.shift(); - if ( !name ) - jQuery.removeData( elem ); - } + // If the fx queue is dequeued, always remove the progress sentinel + if( fn === "inprogress" ) fn = queue.shift(); - // Otherwise, we want to remove all of the element's data - } else { - // Clean up the element expando - try { - delete elem[ expando ]; - } catch(e){ - // IE has trouble directly removing the expando - // but it's ok with using removeAttribute - if ( elem.removeAttribute ) - elem.removeAttribute( expando ); - } + if( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if( type == "fx" ) queue.unshift("inprogress"); - // Completely remove the data cache - delete jQuery.cache[ id ]; + fn.call(elem, function() { jQuery.dequeue(elem, type); }); } - }, - queue: function( elem, type, data ) { - if ( elem ){ - - type = (type || "fx") + "queue"; - - var q = jQuery.data( elem, type ); - - if ( !q || jQuery.isArray(data) ) - q = jQuery.data( elem, type, jQuery.makeArray(data) ); - else if( data ) - q.push( data ); - - } - return q; - }, - - dequeue: function( elem, type ){ - var queue = jQuery.queue( elem, type ), - fn = queue.shift(); - - if( !type || type === "fx" ) - fn = queue[0]; - - if( fn !== undefined ) - fn.call(elem); } }); jQuery.fn.extend({ data: function( key, value ){ + if(typeof key === "undefined" && this.length) return jQuery.data(this[0], true); + var parts = key.split("."); parts[1] = parts[1] ? "." + parts[1] : ""; @@ -275,16 +135,19 @@ jQuery.fn.extend({ if ( data === undefined ) return jQuery.queue( this[0], type ); - return this.each(function(){ + return this.each(function(i, elem){ var queue = jQuery.queue( this, type, data ); - - if( type == "fx" && queue.length == 1 ) - queue[0].call(this); + + if( type == "fx" && queue[0] !== "inprogress" ) + jQuery.dequeue( this, type ) }); }, dequeue: function(type){ return this.each(function(){ jQuery.dequeue( this, type ); }); + }, + clearQueue: function(type){ + return this.queue( type || "fx", [] ); } -}); +}); \ No newline at end of file