Skip to content
Permalink
Browse files

Landing pull request 503. 1.7 data: set a flag in the private data ca…

…che to avoid having to scan attributes multiple times - Fixes #8909.

More Details:
 - #503
 - http://bugs.jquery.com/ticket/8909
  • Loading branch information...
gnarf authored and timmywil committed Sep 19, 2011
1 parent d5f144a commit 2831cfd072125a51f454346211666c9e11641474
Showing with 27 additions and 4 deletions.
  1. +6 −4 src/data.js
  2. +21 −0 test/unit/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 ) {
@@ -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();

});

0 comments on commit 2831cfd

Please sign in to comment.
You can’t perform that action at this time.