]> source.dussan.org Git - jquery.git/commitdiff
Correct non-null|undefined evaluation of data property values. Fixes #9794
authorRick Waldron <waldron.rick@gmail.com>
Mon, 11 Jul 2011 01:42:40 +0000 (21:42 -0400)
committerRick Waldron <waldron.rick@gmail.com>
Mon, 11 Jul 2011 01:45:50 +0000 (21:45 -0400)
src/data.js
test/unit/data.js

index f69d9decd8dd6c962a3f8f57cc1277217babdd47..353a0918cc787e7ac7a966c963f8da3865bdc2f1 100644 (file)
@@ -33,7 +33,9 @@ jQuery.extend({
                        return;
                }
 
-               var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
+               var thisCache, ret,
+                       internalKey = jQuery.expando,
+                       getByName = typeof name === "string",
 
                        // We have to handle DOM nodes and JS objects differently because IE6-7
                        // can't GC object references properly across the DOM-JS boundary
@@ -108,10 +110,24 @@ jQuery.extend({
                        return thisCache[ internalKey ] && thisCache[ internalKey ].events;
                }
 
-               return getByName ? 
-                       // Check for both converted-to-camel and non-converted data property names
-                       thisCache[ jQuery.camelCase( name ) ] || thisCache[ name ] :
-                       thisCache;
+               // Check for both converted-to-camel and non-converted data property names
+               // If a data property was specified
+               if ( getByName ) {
+
+                       // First try to find the camelCased property
+                       ret = thisCache[ jQuery.camelCase( name ) ];
+
+                       // Test for null|undefined property data was found
+                       if ( ret == null ) {
+
+                               // Try to find as-is property data
+                               ret = thisCache[ name ];
+                       }
+               } else {
+                       ret = thisCache;
+               }
+
+               return ret;
        },
 
        removeData: function( elem, name, pvt /* Internal Use Only */ ) {
index 87a3de339c3e89a7307dd1ad35a0ab6dd0164618..c62bd1cc10c6d3b9a8c34e3096ad147073d1a8b1 100644 (file)
@@ -525,3 +525,29 @@ test("jQuery.data should not miss data with preset hyphenated property names", f
                equal( div.data(k), k, "data with property '"+k+"' was correctly found");
        });
 });
+
+test("jQuery.data supports interoperable hyphenated/camelCase get/set of properties with arbitrary non-null|NaN|undefined values", function() {
+
+       var div = jQuery("<div/>", { id: "hyphened" }).appendTo("#qunit-fixture"),
+               datas = {
+                       "non-empty": "a string",
+                       "empty-string": "",
+                       "one-value": 1,
+                       "zero-value": 0,
+                       "an-array": [],
+                       "an-object": {},
+                       "bool-true": true,
+                       "bool-false": false,
+                       "some-json": '{ "foo": "bar" }'
+               };
+
+       expect( 18 );
+
+       jQuery.each( datas, function( key, val ) {
+               div.data( key, val );
+
+               deepEqual( div.data( key ), val, "get: " + key );
+               deepEqual( div.data( jQuery.camelCase( key ) ), val, "get: " + jQuery.camelCase( key ) );
+       });
+});
+