diff options
author | Corey Frang <gnarf@gnarf.net> | 2011-09-19 16:13:57 -0400 |
---|---|---|
committer | timmywil <timmywillisn@gmail.com> | 2011-09-19 16:13:57 -0400 |
commit | 2831cfd072125a51f454346211666c9e11641474 (patch) | |
tree | acc942367a34dda1c9680bc1f81e0461e95884dd | |
parent | d5f144a7bba98212d6fe9e257f722b62baf651f0 (diff) | |
download | jquery-2831cfd072125a51f454346211666c9e11641474.tar.gz jquery-2831cfd072125a51f454346211666c9e11641474.zip |
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
-rw-r--r-- | src/data.js | 10 | ||||
-rw-r--r-- | 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( "<div data-test='testing'>" ), + 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(); + +}); |