From 190812c3be99bde536d373b6b6ab65cfe053a532 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Thu, 16 Jul 2009 07:32:31 +0000 Subject: [PATCH] Refactor jQuery.data a bit to reduce property lookups - Also added jQuery.isEmptyObject --- src/core.js | 6 ++++++ src/data.js | 38 +++++++++++++++----------------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/core.js b/src/core.js index b51886f48..74b9fee39 100644 --- a/src/core.js +++ b/src/core.js @@ -291,6 +291,12 @@ jQuery.extend({ return this.constructor.call(obj) === Object; }, + isEmptyObject: function( obj ) { + var name = ""; + for(name in obj) break; + return !name; + }, + // check if an element is in a (or is an) XML document isXMLDoc: function( elem ) { return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || diff --git a/src/data.js b/src/data.js index 1d5fe8954..9cc76c603 100644 --- a/src/data.js +++ b/src/data.js @@ -8,27 +8,24 @@ jQuery.extend({ 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; - if(name === true) return jQuery.cache[ id ] - - // 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 ) { @@ -36,21 +33,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 ); } @@ -67,7 +59,7 @@ jQuery.extend({ } // Completely remove the data cache - delete jQuery.cache[ id ]; + delete cache[ id ]; } }, queue: function( elem, type, data ) {