diff --git a/src/data.js b/src/data.js index 5656f9ac..177af6ac 100644 --- a/src/data.js +++ b/src/data.js @@ -3,8 +3,26 @@ var oldData = jQuery.data; jQuery.data = function( elem, name, value ) { var curData; + // Name can be an object, and each entry in the object is meant to be set as data + if ( name && typeof name === "object" && arguments.length === 2 ) { + curData = jQuery.hasData( elem ) && oldData.call( this, elem ); + var sameKeys = {}; + for ( var key in name ) { + if ( key !== jQuery.camelCase( key ) ) { + migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key ); + curData[ key ] = name[ key ]; + } else { + sameKeys[ key ] = name[ key ]; + } + } + + oldData.call( this, elem, sameKeys ); + + return name; + } + // If the name is transformed, look for the un-transformed name in the data object - if ( name && name !== jQuery.camelCase( name ) ) { + if ( name && typeof name === "string" && name !== jQuery.camelCase( name ) ) { curData = jQuery.hasData( elem ) && oldData.call( this, elem ); if ( curData && name in curData ) { migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name ); diff --git a/test/data.js b/test/data.js index 2dd834b7..45f7a03f 100644 --- a/test/data.js +++ b/test/data.js @@ -50,3 +50,55 @@ test( "jQuery.data() camelCased names", function( assert ) { } ); } ); + +test( "jQuery.data() camelCased names (mass setter)", function( assert ) { + var sames = [ + "datum", + "ropeAdope", + "Олег\u0007Michał", + "already-Big", + "number-2", + "unidash-" + ], + diffs = [ + "dat-data", + "hangy-dasher-", + "-dashy-hanger" + ]; + + assert.expect( 11 ); + + var div = document.createElement( "div" ); + + // = sames.length + noWarning + expectNoWarning( "Data set as an object and get without warning via API", function() { + var testData = {}; + + sames.forEach( function( name, index ) { + testData[ name ] = index; + } ); + + jQuery.data( div, testData ); + + sames.forEach( function( name, index ) { + assert.equal( jQuery.data( div, name ), index, name + "=" + index ); + } ); + } ); + + // = diffs.length + warning + expectWarning( "Data set as an object and get without warning via API", function() { + var testData = {}; + + diffs.forEach( function( name, index ) { + testData[ name ] = index; + } ); + + jQuery.data( div, testData ); + + diffs.forEach( function( name, index ) { + assert.equal( jQuery.data( div, name ), index, name + "=" + index ); + } ); + } ); + +} ); +