mirror of
https://github.com/jquery/jquery.git
synced 2026-01-11 01:08:03 -05:00
Data: remove the expando when there's no more data
Fixes gh-1760 Close gh-2271
This commit is contained in:
@@ -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 ];
|
||||
|
||||
@@ -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" );
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -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" );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user