From 2831cfd072125a51f454346211666c9e11641474 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Mon, 19 Sep 2011 16:13:57 -0400 Subject: [PATCH] Landing pull request 503. 1.7 data: set a flag in the private data cache to avoid having to scan attributes multiple times - Fixes #8909. More Details: - https://github.com/jquery/jquery/pull/503 - http://bugs.jquery.com/ticket/8909 --- src/data.js | 10 ++++++---- test/unit/data.js | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/data.js b/src/data.js index 9de0da1c5..1c6d1852c 100644 --- a/src/data.js +++ b/src/data.js @@ -231,14 +231,15 @@ jQuery.extend({ jQuery.fn.extend({ data: function( key, value ) { - var data = null; + var parts, attr, name, + data = null; if ( typeof key === "undefined" ) { if ( this.length ) { data = jQuery.data( this[0] ); - if ( this[0].nodeType === 1 ) { - var attr = this[0].attributes, name; + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; for ( var i = 0, l = attr.length; i < l; i++ ) { name = attr[i].name; @@ -248,6 +249,7 @@ jQuery.fn.extend({ dataAttr( this[0], name, data[ name ] ); } } + jQuery._data( this[0], "parsedAttrs", true ); } } @@ -259,7 +261,7 @@ jQuery.fn.extend({ }); } - var parts = key.split("."); + parts = key.split("."); parts[1] = parts[1] ? "." + parts[1] : ""; if ( value === undefined ) { diff --git a/test/unit/data.js b/test/unit/data.js index ebeb1b4ee..4feba32c0 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -599,3 +599,24 @@ test("Triggering the removeData should not throw exceptions. (#10080)", function // change the url to trigger unload frame.attr("src", "data/iframe.html?param=true"); }); + +test( "Only check element attributes once when calling .data() - #8909", function() { + expect( 2 ); + var testing = { + test: "testing", + test2: "testing" + }, + element = jQuery( "
" ), + node = element[ 0 ]; + + // set an attribute using attr to ensure it + node.setAttribute( "data-test2", "testing" ); + deepEqual( element.data(), testing, "Sanity Check" ); + + node.setAttribute( "data-test3", "testing" ); + deepEqual( element.data(), testing, "The data didn't change even though the data-* attrs did" ); + + // clean up data cache + element.remove(); + +}); -- 2.39.5