From 0e982433eb94391b3e9f6838d9b8fbf9bb31abf9 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Sat, 18 Jul 2015 11:27:11 -0700 Subject: Data: avoid using delete on DOM nodes Closes gh-2479 --- src/data/Data.js | 18 +++++++++++++----- src/manipulation.js | 10 ++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/data/Data.js b/src/data/Data.js index e0d1eadcd..625d203cf 100644 --- a/src/data/Data.js +++ b/src/data/Data.js @@ -20,13 +20,12 @@ Data.prototype = { if ( owner.nodeType ) { owner[ this.expando ] = value; - // Otherwise secure it in a non-enumerable, non-writable property - // configurability must be true to allow the property to be - // deleted with the delete operator + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed } else { Object.defineProperty( owner, this.expando, { value: value, - writable: true, configurable: true } ); } @@ -144,7 +143,16 @@ Data.prototype = { // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - delete owner[ this.expando ]; + + // Support: Chrome <= 35-45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } } }, hasData: function( owner ) { diff --git a/src/manipulation.js b/src/manipulation.js index b85ef1824..ceb970cbd 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -290,10 +290,16 @@ jQuery.extend( { } } } - delete elem[ dataPriv.expando ]; + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; } if ( elem[ dataUser.expando ] ) { - delete elem[ dataUser.expando ]; + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; } } } -- cgit v1.2.3