Data: remove the expando when there's no more data

Fixes gh-1760
Close gh-2271
This commit is contained in:
Timmy Willison
2015-05-06 15:29:06 -07:00
parent 764dc949d0
commit 56bb677725
4 changed files with 48 additions and 13 deletions

View 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 ];

View 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" );
}
},

View 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" );
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 );
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" );
}
}
});

View 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() {