diff --git a/src/data.js b/src/data.js index b8e7b1de5..6e1465b3b 100644 --- a/src/data.js +++ b/src/data.js @@ -1,4 +1,4 @@ -var user, priv, +var user, priv, data_user, data_priv, rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, rmultiDash = /([A-Z])/g; @@ -131,13 +131,14 @@ Data.prototype = { // This will be used by remove() in manipulation to sever // remaining references to node objects. One day we'll replace the dual // arrays with a WeakMap and this won't be an issue. -// function data_discard( owner ) { - // user.discard( owner ); - // priv.discard( owner ); -// } +function data_discard( owner ) { + user.discard( owner ); + priv.discard( owner ); +} -user = new Data(); -priv = new Data(); +// These may used throughout the jQuery core codebase +user = data_user = new Data(); +priv = data_priv = new Data(); jQuery.extend({ @@ -198,7 +199,7 @@ jQuery.fn.extend({ dataAttr( elem, name, data[ name ] ); } } - priv.set( elem, { hasDataAttrs: true }); + priv.set( elem, "hasDataAttrs", true ); } } diff --git a/src/event.js b/src/event.js index 733e563c2..4e7f7424c 100644 --- a/src/event.js +++ b/src/event.js @@ -16,7 +16,7 @@ jQuery.event = { t = 0; // Don't attach events to noData or text/comment nodes (allow plain objects tho) - if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = data_priv.get( elem )) ) { return; } @@ -124,7 +124,7 @@ jQuery.event = { var tns, type, origType, namespaces, origCount, j, events, special, eventType, handleObj, t = 0, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + elemData = data_priv.hasData( elem ) && data_priv.get( elem ); if ( !elemData || !(events = elemData.events) ) { return; diff --git a/src/manipulation.js b/src/manipulation.js index 9aea16f9d..a121ccbc7 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -327,7 +327,7 @@ jQuery.fn.extend({ for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Hope ajax is available... @@ -514,20 +514,16 @@ jQuery.extend({ }, cleanData: function( elems, /* internal */ acceptData ) { - var id, data, elem, type, + var data, elem, type, l = elems.length, i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, special = jQuery.event.special; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( acceptData || jQuery.acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; + data = data_priv.access( elem ); if ( data ) { for ( type in data.events ) { @@ -539,14 +535,12 @@ jQuery.extend({ jQuery.removeEvent( elem, type, data.handle ); } } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - delete cache[ id ]; - delete elem[ internalKey ]; - } } } + + // Discard any remaining `private` and `user` data + // (Splices the data objects out of the internal cache arrays) + data_discard( elem ); } } }); @@ -580,35 +574,45 @@ function setGlobalEval( elems, refElements ) { i = 0; for ( ; i < l; i++ ) { - jQuery._data( elems[ i ], "globalEval", !refElements || jQuery._data( refElements[ i ], "globalEval" ) ); + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); } } function cloneCopyEvent( src, dest ) { + var i, l, type, pOld, pCur, uOld, uCur, events; - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + if ( dest.nodeType !== 1 ) { return; } - var i, l, type, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pOld = data_priv.access( src ); + pCur = jQuery.extend( {}, pOld ); + events = pOld.events; - if ( events ) { - delete curData.handle; - curData.events = {}; + data_priv.set( dest, pCur ); - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); + if ( events ) { + delete pCur.handle; + pCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } } } } - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); + // 2. Copy user data + if ( data_user.hasData( src ) ) { + uOld = data_user.access( src ); + uCur = jQuery.extend( {}, uOld ); + + data_user.set( dest, uCur ); } }