]> source.dussan.org Git - jquery.git/commitdiff
Data: remove the expando when there's no more data
authorTimmy Willison <timmywillisn@gmail.com>
Wed, 6 May 2015 22:29:06 +0000 (15:29 -0700)
committerTimmy Willison <timmywillisn@gmail.com>
Tue, 12 May 2015 14:09:40 +0000 (10:09 -0400)
Fixes gh-1760
Close gh-2271

src/data/Data.js
src/event.js
test/unit/data.js
test/unit/event.js

index d56e378394877af0bee897484a9af4e950fb233e..5268f3f2cdd6b83aa8cb6b59f29d50dde0daa177 100644 (file)
@@ -120,10 +120,7 @@ Data.prototype = {
                        return;
                }
 
-               if ( key === undefined ) {
-                       this.register( owner );
-
-               } else {
+               if ( key !== undefined ) {
 
                        // Support array or space separated string of keys
                        if ( jQuery.isArray( key ) ) {
@@ -147,6 +144,11 @@ Data.prototype = {
                                delete cache[ key[ i ] ];
                        }
                }
+
+               // Remove the expando if there's no more data
+               if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+                       delete owner[ this.expando ];
+               }
        },
        hasData: function( owner ) {
                var cache = owner[ this.expando ];
index b371b9a272ccb267361ca31c1c3ea54062a9e5c3..584ba90737229e9828849f05ea051347791fc926 100644 (file)
@@ -216,14 +216,9 @@ jQuery.event = {
                        }
                }
 
-               // Remove the expando if it's no longer used
+               // Remove data and the expando if it's no longer used
                if ( jQuery.isEmptyObject( events ) ) {
-                       // Normally this should go through the data api
-                       // but since event.js owns these properties,
-                       // this exception is made for the sake of optimizing
-                       // the operation.
-                       delete elemData.handle;
-                       delete elemData.events;
+                       dataPriv.remove( elem, "handle events" );
                }
        },
 
index c08550b1b9969fb3cd6276e2b29a7527cf0de41e..20e5af8281d2850af83ad2511ae6839892700d3f 100644 (file)
@@ -837,7 +837,24 @@ test("Check proper data removal of non-element descendants nodes (#8335)", 1, fu
 });
 
 testIframeWithCallback( "enumerate data attrs on body (#14894)", "data/dataAttrs.html", function( result ) {
-       expect(1);
+       expect( 1 );
+
+       equal( result, "ok", "enumeration of data- attrs on body" );
+});
+
+test( "Check that the expando is removed when there's no more data", function() {
+       expect( 1 );
 
-       equal(result, "ok", "enumeration of data- attrs on body" );
+       var key,
+               div = jQuery( "<div/>" );
+       div.data( "some", "data" );
+       equal( div.data( "some" ), "data", "Data is added" );
+       div.removeData( "some" );
+
+       // Make sure the expando is gone
+       for ( key in div[ 0 ] ) {
+               if ( /^jQuery/.test( key ) ) {
+                       ok( false, "Expando was not removed when there was no more data" );
+               }
+       }
 });
index 95f6f4b33aa0edf29329935f7035cf3a4e89c9c8..d9bdafc343457bce45929de58fac0b27c81cf377 100644 (file)
@@ -2657,6 +2657,27 @@ test( "Inline event result is returned (#13993)", function() {
        equal( result, 42, "inline handler returned value" );
 });
 
+test( ".off() removes the expando when there's no more data", function() {
+       expect( 1 );
+
+       var key,
+               div = jQuery( "<div/>" ).appendTo( "#qunit-fixture" );
+
+       div.on( "click", false );
+       div.on( "custom", function() {
+               ok( true, "Custom event triggered" );
+       } );
+       div.trigger( "custom" );
+       div.off( "click custom" );
+
+       // Make sure the expando is gone
+       for ( key in div[ 0 ] ) {
+               if ( /^jQuery/.test( key ) ) {
+                       ok( false, "Expando was not removed when there was no more data" );
+               }
+       }
+});
+
 // This tests are unreliable in Firefox
 if ( !(/firefox/i.test( window.navigator.userAgent )) ) {
        test( "Check order of focusin/focusout events", 2, function() {