From c1b8edfcc90961290f7555c55851209bc860c0b4 Mon Sep 17 00:00:00 2001 From: Rick Waldron Date: Wed, 17 Apr 2013 12:53:41 -0400 Subject: [PATCH] Optimize cleanData: allow direct access to data_priv for cleanup --- src/data.js | 4 +++- src/manipulation.js | 44 ++++++++++++++++++++++---------------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/data.js b/src/data.js index 95d06a000..86dd4273f 100644 --- a/src/data.js +++ b/src/data.js @@ -185,7 +185,9 @@ Data.prototype = { ); }, discard: function( owner ) { - delete this.cache[ this.key( owner ) ]; + if ( owner[ this.expando ] ) { + delete this.cache[ owner[ this.expando ] ]; + } } }; diff --git a/src/manipulation.js b/src/manipulation.js index 58a598144..ccf606d29 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -433,35 +433,35 @@ jQuery.extend({ }, cleanData: function( elems ) { - var data, elem, type, - l = elems.length, - i = 0, - special = jQuery.event.special; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( jQuery.acceptData( elem ) ) { + var data, elem, events, type, key, j, + special = jQuery.event.special, + i = 0; - data = data_priv.access( elem ); + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( Data.accepts( elem ) ) { + key = elem[ data_priv.expando ]; - if ( data ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); + if ( key && (data = data_priv.cache[ key ]) ) { + events = Object.keys( data.events || {} ); + if ( events.length ) { + for ( j = 0; (type = events[j]) !== undefined; j++ ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } } } + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; + } } } - // Discard any remaining `private` and `user` data - // One day we'll replace the dual arrays with a WeakMap and this won't be an issue. - // (Splices the data objects out of the internal cache arrays) - data_user.discard( elem ); - data_priv.discard( elem ); + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; } }, -- 2.39.5