Skip to content

Commit

Permalink
Fix bug when accessing .data() on an empty set. Return null rather th…
Browse files Browse the repository at this point in the history
…an throwing exception.
  • Loading branch information
jacwright authored and jeresig committed Sep 22, 2010
1 parent 1f667aa commit 626624a
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 15 deletions.
4 changes: 2 additions & 2 deletions src/data.js
Expand Up @@ -129,8 +129,8 @@ jQuery.extend({


jQuery.fn.extend({ jQuery.fn.extend({
data: function( key, value ) { data: function( key, value ) {
if ( typeof key === "undefined" && this.length ) { if ( typeof key === "undefined" ) {
return jQuery.data( this[0] ); return this.length ? jQuery.data( this[0] ) : null;


} else if ( typeof key === "object" ) { } else if ( typeof key === "object" ) {
return this.each(function() { return this.each(function() {
Expand Down
29 changes: 16 additions & 13 deletions test/unit/data.js
Expand Up @@ -2,25 +2,25 @@ module("data");


test("expando", function(){ test("expando", function(){
expect(7); expect(7);

equals("expando" in jQuery, true, "jQuery is exposing the expando"); equals("expando" in jQuery, true, "jQuery is exposing the expando");

var obj = {}; var obj = {};
jQuery.data(obj); jQuery.data(obj);
equals( jQuery.expando in obj, true, "jQuery.data adds an expando to the object" ); equals( jQuery.expando in obj, true, "jQuery.data adds an expando to the object" );
equals( typeof obj[jQuery.expando], "function", "jQuery.data adds an expando to the object as a function" ); equals( typeof obj[jQuery.expando], "function", "jQuery.data adds an expando to the object as a function" );


obj = {}; obj = {};
jQuery.data(obj, 'test'); jQuery.data(obj, 'test');
equals( jQuery.expando in obj, false, "jQuery.data did not add an expando to the object" ); equals( jQuery.expando in obj, false, "jQuery.data did not add an expando to the object" );


obj = {}; obj = {};
jQuery.data(obj, "foo", "bar"); jQuery.data(obj, "foo", "bar");
equals( jQuery.expando in obj, true, "jQuery.data added an expando to the object" ); equals( jQuery.expando in obj, true, "jQuery.data added an expando to the object" );

var id = obj[jQuery.expando](); var id = obj[jQuery.expando]();
equals( id in jQuery.cache, false, "jQuery.data did not add an entry to jQuery.cache" ); equals( id in jQuery.cache, false, "jQuery.data did not add an entry to jQuery.cache" );

equals( id.foo, "bar", "jQuery.data worked correctly" ); equals( id.foo, "bar", "jQuery.data worked correctly" );
}); });


Expand All @@ -29,21 +29,21 @@ test("jQuery.data", function() {
var div = document.createElement("div"); var div = document.createElement("div");


ok( jQuery.data(div, "test") === undefined, "Check for no data exists" ); ok( jQuery.data(div, "test") === undefined, "Check for no data exists" );

jQuery.data(div, "test", "success"); jQuery.data(div, "test", "success");
equals( jQuery.data(div, "test"), "success", "Check for added data" ); equals( jQuery.data(div, "test"), "success", "Check for added data" );


ok( jQuery.data(div, "notexist") === undefined, "Check for no data exists" ); ok( jQuery.data(div, "notexist") === undefined, "Check for no data exists" );

var data = jQuery.data(div); var data = jQuery.data(div);
same( data, { "test": "success" }, "Return complete data set" ); same( data, { "test": "success" }, "Return complete data set" );

jQuery.data(div, "test", "overwritten"); jQuery.data(div, "test", "overwritten");
equals( jQuery.data(div, "test"), "overwritten", "Check for overwritten data" ); equals( jQuery.data(div, "test"), "overwritten", "Check for overwritten data" );

jQuery.data(div, "test", undefined); jQuery.data(div, "test", undefined);
equals( jQuery.data(div, "test"), "overwritten", "Check that data wasn't removed"); equals( jQuery.data(div, "test"), "overwritten", "Check that data wasn't removed");

jQuery.data(div, "test", null); jQuery.data(div, "test", null);
ok( jQuery.data(div, "test") === null, "Check for null data"); ok( jQuery.data(div, "test") === null, "Check for null data");


Expand All @@ -65,7 +65,10 @@ test(".data()", function() {


var div = jQuery("#foo"); var div = jQuery("#foo");
div.data("test", "success"); div.data("test", "success");
same( div.data(), {test: "success"}, "data() get the entire data object" ) same( div.data(), {test: "success"}, "data() get the entire data object" );

var nodiv = jQuery("#unfound");
equals( nodiv.data(), null, "data() on empty set returns null" );

This comment has been minimized.

Copy link
@jeresig

jeresig Sep 22, 2010

Member

Fixed here: 0b4b3ee

}) })


test(".data(String) and .data(String, Object)", function() { test(".data(String) and .data(String, Object)", function() {
Expand Down Expand Up @@ -145,14 +148,14 @@ test(".data(String) and .data(String, Object)", function() {
equals( div.data("test"), "testroot", "Check for original data" ); equals( div.data("test"), "testroot", "Check for original data" );
equals( div.data("test.foo"), "testfoo", "Check for namespaced data" ); equals( div.data("test.foo"), "testfoo", "Check for namespaced data" );
equals( div.data("test.bar"), "testroot", "Check for unmatched namespace" ); equals( div.data("test.bar"), "testroot", "Check for unmatched namespace" );

// #3748 // #3748
var $elem = jQuery({}); var $elem = jQuery({});
equals( $elem.data('nothing'), undefined, "Non-existent data returns undefined"); equals( $elem.data('nothing'), undefined, "Non-existent data returns undefined");
equals( $elem.data('null',null).data('null'), null, "null's are preserved"); equals( $elem.data('null',null).data('null'), null, "null's are preserved");
equals( $elem.data('emptyString','').data('emptyString'), '', "Empty strings are preserved"); equals( $elem.data('emptyString','').data('emptyString'), '', "Empty strings are preserved");
equals( $elem.data('false',false).data('false'), false, "false's are preserved"); equals( $elem.data('false',false).data('false'), false, "false's are preserved");

// Clean up // Clean up
$elem.removeData(); $elem.removeData();
}); });
Expand Down

0 comments on commit 626624a

Please sign in to comment.